2013-12-18 217 views
1

我有兩個六邊形,我試圖在邊緣達到一定的公差時將它們拼合在一起。查找兩條線之間的距離

我怎樣才能找到最接近的邊緣?

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); 
} 

這裏是一個標準點陣列爲他的一個xagons是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} 
+0

這聽起來更像是一個數學問題,而不是編程問題。無論如何,你到目前爲止做了什麼?您需要顯示代碼才能獲得幫助。 –

+0

這是一個數學問題,我有一堆代碼不涉及處理拖動和兩點之間的距離問題。你想看見什麼? – Ashbury

+0

如果不需要100%精確的結果,則可以計算六邊形中心之間的距離,從而將它們近似爲圓形。只要(x1-x2)^ 2 +(y1-y2)^ 2低於一個閾值,讓它們對齊。 –

回答

0

爲了計算如果搶購,看到其他的答案。

至於哪裏搶購(其邊緣),我認爲這是你真正的問題:計算使用

atan2(midy1-midy2,midx1-midx2)的相對角度。

您將得到一個以弧度表示的值,該值用於描述格子之間的連接線的角度。 0 =水平線。

計算Math.floor(value*6/(2*pi)) - >您會得到0..5之間的數字表示邊緣配對。

如果您的內六角是可旋轉的,您需要在value之間添加/減去旋轉(以rad爲單位)。 (這些標誌最好在一張紙上計算出來)。

編輯:關於您的距離計算,建議儘量使用距離的平方(例如,比較x^2 + y^2與閾值^ 2),以避免昂貴的Math.sqrt操作。特別是在測試與衆多其他物體的距離時。

+0

謝謝,這確實有幫助,那麼這是什麼我的黑線是一個視覺表示? 關注 - 如果是快照,我仍然在試圖找出如何應用歐氏距離公式。完美地捕捉到西南邊緣,我的中點到中點的距離爲85,而在西邊緣完美地捕捉到93.有沒有一個公式來測試相應邊緣之間的距離? (NE和SW)與(N和S)? – Ashbury

1

如果你有2個百分點的座標像P1(X1,Y1)和P2(x2,y2)上。你可以這樣做:

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

使用Euclian距離公式

DIST =開方((X2-XQ)^ 2 +(Y2-Y1)^ 2)

+0

這對兩點很有幫助,但是兩條線呢? – Ashbury

+0

找到邊緣點然後嘗試使用 – xrcwrn

0

找到的最接近你甲肝說我們怎麼哪些邊緣你有沒有每個六角形邊緣線的信息。在這裏,我假設他們可以通過數組訪問每個六邊形的屬性。所以我們有六個邊(邊[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)); 
} 

總結:

  • 檢查距離hexagon1和 hexagon2的每個邊緣中心的每個邊緣的中心之間。
  • 每條邊的中心點是其起點和終點的起點和終點的中點:((x1 + x2)/ 2,(y1 + y2)/ 2)。
  • 兩點的距離可以通過sqrt(dx * dx + dy * dy)公式計算。
+0

以獲得更好的性能,正如Torben Klein所說的那樣,當測試距離值時可以省略'sqrt'函數,因爲如果a大於b,那麼a * a也將大於b * b和sqrt(a)大於sqrt(b)。 –

相關問題