找到两个六边形之间的距离

时间:2013-12-18 05:33:29

标签: javascript geometry

我有两个六边形,当边缘达到一定的公差时,我试图将它们咬合在一起。

如何找到最接近的边缘?

Hexagon 1, Side 1 is closest to Hexagon 3, Side 4

Hexagon 1, Side 2 is closest to Hexagon 3, Side 5

以下是返回两个最接近的六边形的代码:

Canvas.getClosestPiece = function(){
  var current = {};
  current.x = selection.MidPoint.X;
  current.y = selection.MidPoint.Y;
  smallestDistance = null;
  closestHex = null;

  hexagons.forEach(function(hexagon){
    if(hexagon !== selection){
      testPiece = {};
      testPiece.x = hexagon.MidPoint.X;
      testPiece.y = hexagon.MidPoint.Y;
      if((lineDistance(current, testPiece) < smallestDistance) || smallestDistance === null){
        smallestDistance = lineDistance(current, testPiece)
        closestHex = hexagon
        hexagons.forEach(function(hexagon){
          hexagon.lineColor = 'grey'
        })
        hexagon.lineColor = 'red';
      }
    }
  })
  // console.log(smallestDistance)
  return [selection, closestHex]
}

两个六边形中点之间的距离:

function lineDistance( point1, point2 ){
  var xs = 0;
  var ys = 0;

  xs = point2.x - point1.x;
  xs = xs * xs;

  ys = point2.y - point1.y;
  ys = ys * ys;

  return Math.sqrt( xs + ys );
}

这是getClosestPiece返回的六边形之一的标准点数组:

Point {X: 658, Y: 284} 
Point {X: 704, Y: 304} 
Point {X: 704, Y: 354} 
Point {X: 658, Y: 375} 
Point {X: 613, Y: 354} 
Point {X: 613, Y: 304} 

4 个答案:

答案 0 :(得分:1)

如果你的坐标有2个点,如p1(x1,y1)和p2(x2,y2)。你可以这样做:

var disptance = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));

答案 1 :(得分:0)

要计算如果要捕捉,请参阅其他答案。

至于其中要捕捉(哪些边缘),我认为这是你真正的问题:使用

计算相对角度

atan2(midy1-midy2,midx1-midx2)。

你得到一个弧度值,它描述了六边形之间连接线的角度。 0 =水平线。

计算Math.floor(value*6/(2*pi)) - &gt;你得到一个介于0到5之间的数字,表示边缘配对。

如果你的咒语是可旋转的,你需要在/ value中添加/减去rotatins(以rad为单位)。 (这些标志最好在一张纸上找到)。

编辑:关于距离计算,建议尽可能长时间地使用距离的平方(例如,将x ^ 2 + y ^ 2与阈值^ 2进行比较),以避免昂贵的Math.sqrt操作。特别是在测试与众多其他物体的距离时。

答案 2 :(得分:0)

使用欧氏距离公式

dist = sqrt((x2-xq)^ 2 +(y2-y1)^ 2)

答案 3 :(得分:0)

找到哪条边最近,你要告诉我们你怎么知道每个六边形的边线信息。在这里,我假设它们可以通过数组访问,作为每个六边形的属性。所以我们每个六边形有6个边(边[0]到边[5])。我们可以通过循环它们并测量每个边缘的中心之间的距离来找到最近的边缘。示例代码如下所示:

var dMin=-1, iMin=-1, jMin=-1; //info about the min distance

for(var i=0; i<5; i++) //loop through hexagon1.edges
{
 var p1 = midPointOfLine( hexagon1.edges[i] ); //center of this edge line 
 for(var j=0; j<5; j++) //loop through hexagon2.edges
  {
    var p2 = midPointOfLine( hexagon2.edges[j] ); //center of this edge line 
    var d = getDistance(p1, p2); //get distance of two points
    if (d<dMin || dMin==-1) {dMin=d; iMin=i; jMin=j;} //store the info about the min distance
  }
}


 function midPointOfLine(edge) // return new point( X=(X1+X2)/2 , Y=(Y1+Y2)/2 )
 {
  var mp; //define a new point
  mp.X = (edge.startPoint.X + edge.endPoint.X) / 2;
  mp.Y = (edge.startPoint.Y + edge.endPoint.Y) / 2;
  return mp;
 }

 function getDistance(p1, p2) //return sqrt( (X2-X1)^2 + (Y2-Y1)^2 )
 {
  return Math.sqrt( Math.pow(p2.X - p1.X, 2) + Math.pow(p2.Y - p1.Y, 2) );
 }

摘要:

  • 检查六边形1的每个边缘的中心与中心之间的距离 hexagon2的每个边缘。
  • 每条边的中心都是它的中点 起点和终点:((x1 + x2)/ 2,(y1 + y2)/ 2)。
  • 可以从sqrt(dx * dx + dy * dy)公式计算两点的距离。