Я задал этот вопрос раньше, но не сообщил об этом ясно, поэтому простите меня за дубликат. Это должно быть лучше.Найти пересечение двух линий с постоянным наклоном и сменой координат
Мне нужно определить положение координаты, учитывая три другие координаты и 2 наклона. В принципе, точка пересечения двух линий. Тем не менее, у меня нет всей информации, доступной для решения этой проблемы.
У меня есть произвольная форма, определенная кучей вершин. Пользователь может перетаскивать линию между этими вершинами, и форма должна реагировать, как показано на диаграммах ниже.
Итак, в первом примере пользователь перетаскивает линию EF из положения слева в позицию справа (строка E2F2). Что должно произойти, так это то, что линия EF растет/сжимается, так что наклон остается неизменным и что начальные и конечные координаты остаются на линиях DE и AF соответственно. Это показано как строка E2F2.
Это должно быть достаточно общим, чтобы оно могло обрабатывать любые странные или обычные углы, которые я бросаю на него. Второй набор форм показывает более простой подход. Пользователь перетаскивает линейный CD в положение C2D2. Обратите внимание, что склоны остаются неизменными, а D2 по существу скользит вниз по диагональной линии, а B2C2 и C2D2 удлиняются по длине. В результате все 3 наклона остаются такими же, но линии B2C2 и C2D2 растут в длину, чтобы оставаться на связи, а линия D2E2 сжимается.
Вы должны понимать, что при перемещении линии EF, вы на самом деле движется координата «Е». Итак, первая координата проста. И предыдущий, и следующий никогда не меняются. Поэтому у меня по существу есть наклоны трех соответствующих линий и 3 из 4 необходимых координат. Мне нужен 4-й, поэтому в моем примере F2 или D2.
Этот код вызывается при событии каждый раз, когда координата перемещается. Допустим, мы перетаскиваем линию EF - тогда координата E.
var next = this.model.get("next"), // coordinate F
nextNext = next.get("next"), // coordinate A
nextDx = nextNext.get("x") - next.get("x"), // delta X of AF
nextDy = nextNext.get("y") - next.get("y"), // delta Y of AF
prev = this.model.get("prev"), // coordinate D
prevDx = prev.get("x") - this.model.get("x"), // delta X of DF
prevDy = prev.get("y") - this.model.get("y"), // delta Y of DF
selfDx = next.get("x") - this.model.get("x"), // delta X of EF
selfDy = next.get("y") - this.model.get("y"), // delta Y of EF
selfX = this.initialCoords.x + this.shape.getX(), // the new position of E
selfY = this.initialCoords.y + this.shape.getY(),
selfM, selfB, prevM, prevB, nextM, nextB, m, x, y, b;
// check for would-be infinities
if (selfDx == 0) {
// **** THIS WHOLE BLOCK IS CORRECT ****
// i'm vertical
// we can safely assume prev/next aren't also vertical. i think? right?
prevM = prev.get("slope");
prevB = prev.get("y") - prevM * prev.get("x");
var myX = selfX,
myY = prevM * myX + prevB;
this.model.set({
x: myX,
y: myY
});
nextM = next.get("slope");
nextB = next.get("y") - nextM * next.get("x");
var nextX = selfX,
nextY = nextM * nextX + nextB;
next.set({
x: nextX,
y: nextY
});
} else if (selfDy == 0) {
//***** THIS WHOLE BLOCK IS CORRECT **** //
// i'm horizontal
if (prevDx == 0) {
// prev is a vertical line
this.model.set({
y: selfY
});
} else {
prevM = prev.get("slope");
prevB = prev.get("y") - prevM * prev.get("x");
var myY = selfY,
myX = (selfY - prevB)/prevM;
this.model.set({
x: myX,
y: myY
});
}
if (nextDx == 0) {
// next is a vertical line
next.set({
y: selfY
});
} else {
nextM = next.get("slope");
nextB = next.get("y") - nextM * next.get("x");
var nextY = selfY,
nextX = (selfY - nextB)/nextM;
next.set({
x: nextX,
y: nextY
});
}
} else {
// HELP HERE - you've chosen to drag an arbitrarily angled line. Figure out the "next" coordinate given the "current" one.
selfM = this.model.get("slope");
selfB = this.model.get("y") - this.model.get("slope") * this.model.get("x");
if (selfM < 0) {
prevM = prev.get("slope");
prevB = prev.get("y") - prevM * prev.get("x");
var myY = selfY,
myX = (selfY - prevB)/prevM;
// CORRECT, but need "next" position based on this
this.model.set({
x: myX,
y: myY
});
} else {
// CORRECT but need "next" position based on this.
var myX = selfX;
this.model.set({
x: myX
});
}
}
Я получил его на работу (наконец, это заняло навсегда), используя эту формулу, но с другого сайта и с некоторым вспомогательным кодом для тяжелого подъема. Но я отвечу на ваш ответ. Просто нужно немного поиграть с JS, чтобы заставить его работать. – oooyaya
Спасибо! Просто подумал, что это может указывать на вас в правильном направлении - рад слышать, что вы его отсортировали. –
@oooyaya вы могли бы поделиться своим JS, спасти меня заново изобретать колесо? Благодаря! – Tiago