Как найти координаты линии в HTML5 Canvas

Я разрабатываю приложение для рисования плана здания в HTML5. Для этого мне нужно было разместить двери и окна на стенах. Обычно стены (линии) не прямые. Как я могу узнать, коснулась ли моя мышь стен (линий) при перемещении изображения двери. Кроме того, я должен найти X, Y и угол двери, которую нужно нарисовать. Пожалуйста помоги...


person Yesudass    schedule 12.05.2014    source источник
comment
-1 добавьте свой код, пожалуйста   -  person alessandro    schedule 12.05.2014
comment
Сохранить в массив и сравнить координаты? Что так сложно? знак равно   -  person Dávid Szabó    schedule 12.05.2014
comment
Сохраните все точки линии в массиве :-o У меня есть только X1, Y1, X2, Y2 линии. И двери будут меньше, чем очередь. Его можно разместить в любом месте строки.   -  person Yesudass    schedule 12.05.2014
comment
@Infer-On Как я могу добавить код, который я еще не сделал :-o   -  person Yesudass    schedule 12.05.2014
comment
@YesudassIbnJesus добавьте свой код, пожалуйста   -  person alessandro    schedule 12.05.2014
comment
@Infer-On: будь добр! Спрашивающий хочет знать, как вычислить точку на сегменте линии, ближайшую к мыши, чтобы он мог решить, следует ли и где размещать изображение двери на этом сегменте линии. Он не знает, с чего начать, поэтому у него нет подходящего кода, который он мог бы показать нам — ему нужна отправная точка, чтобы начать программировать.   -  person markE    schedule 12.05.2014
comment
@markE, когда я читал, создавая приложение для рисования Plan, я думал, что Он уже что-то написал. Мне жаль   -  person alessandro    schedule 12.05.2014


Ответы (1)


Вот один из способов:

Сохраните все ваши линейные сегменты (стены) в виде массива.

var walls=[];

var wall={x0:50,y0:50,x1:150,y1:150};

walls.push(wall);

Когда вы перетаскиваете окно на место, сравнивайте положение мыши с ближайшей точкой на каждом сегменте линии (стене). Поместите окно на ближайшую к мыши стену.

Эта функция даст вам ближайшую точку к мыши на любом заданном отрезке линии:

// given a line defined like this

var line={x0:50,y0:50,x1:150,y1:150};

// calculate the closest point on the line to [x,y]

function getClosestPointOnLine(line,x,y) {
    //
    lerp=function(a,b,x){ return(a+x*(b-a)); };
    var dx=line.x1-line.x0;
    var dy=line.y1-line.y0;
    var t=((x-line.x0)*dx+(y-line.y0)*dy)/(dx*dx+dy*dy);
    t=Math.min(1,Math.max(0,t));
    var lineX=lerp(line.x0, line.x1, t);
    var lineY=lerp(line.y0, line.y1, t);
    return({x:lineX,y:lineY});
};

И эта функция вернет расстояние между двумя точками (эти две точки являются положением мыши и вычисленной точкой на стене).

// get distance between 2 points

function distance(x0,y0,x1,y1){
    var dx=x1-x0;
    var dy=y1-y0;
    return(Math.sqrt(dx*dx+dy*dy));
}

Наконец, погуглите встроенный javascript Math.atan2, чтобы получить угол вашей стены, чтобы использовать его в качестве угла вашего окна.

Удачи с вашим проектом!

person markE    schedule 12.05.2014
comment
Ага! Как сейчас лепит?? :) Я думаю, возможно, f.ex. Формула t может быть немного сложна для понимания новичком (?) - я бы посоветовал прокомментировать ее, чтобы было более понятно, что там происходит. - person ; 13.05.2014
comment
Привет @MarkE Спасибо за ваше решение, я пробую его ... Но я не понял, какое расстояние возвращается ... Это одно число? Но, это должно быть xDistance и yDistance должно быть там naa ? - person Yesudass; 13.05.2014
comment
Вау, это работает... Большое спасибо, пометка. Я удалил sqrt и использовал только dx и dy в функции расстояния.. теперь я получаю расстояние X, Y до ближайшей точки :) Большое спасибо.. - person Yesudass; 13.05.2014