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