2013-12-18 3 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 = горизонтальная линия.

Calculate Math.floor(value*6/(2*pi)) -> вы получаете число между 0..5, обозначающее спаривание краев.

Если ваши шестерки вращаются, вам необходимо добавить/выровнять ротаны (в раде) до/от value. (Знаки лучше всего на листе бумаги).

изменить: относительно вашего расчета расстояния желательно работать с квадратом расстояния как можно дольше (например, сравнить x^2 + y^2 с порогом^2), чтобы избежать дорогостоящей операции Math.sqrt , Особенно при тестировании расстояния против множества других объектов.

+0

Спасибо, что это помогает, и так ли моя черная линия является визуальным представлением? Что касается -f- для привязки, я все еще пытаюсь выяснить, как применить формулу евклидовой дистанции. Великолепная привязка к краю SouthWest дает мне расстояние от середины до середины 85, тогда как идеальное привязку к западному краю дает мне 93. Есть ли формула для проверки расстояний между соответствующими краями? (NE и SW) vs (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 Расстояние формула

расстояние = SQRT ((x2-XQ)^2 + (y2-y1)^2)

+0

Это хорошо для двух точек, но как насчет двух линий? – Ashbury

+0

Найдите точку в краю, затем попробуйте это – xrcwrn

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

В Резюме:

  • Проверить расстояние между центром каждого краем hexagon1 и центром каждый краем hexagon2.
  • Центр каждого края - это средняя точка его начальная и конечная точки: ((x1 + x2)/2, (y1 + y2)/2).
  • Расстояние между двумя точками может быть рассчитано по формуле sqrt (dx * dx + dy * dy).
+0

для лучшей производительности, как сказал Торбен Клейн, вы можете исключить функцию 'sqrt', когда значения теста пройдены, потому что если a больше b, то a * a также будет больше, чем b * b и sqrt (a) больше, чем sqrt (b). –

Смежные вопросы