eTotal = ExcelTestSetOutput.Evaluate("=SUM(E:E)")
Я решил для вас уравнения:
k = ((y2-y1) * (x3-x1) - (x2-x1) * (y3-y1)) / ((y2-y1)^2 + (x2-x1)^2)
x4 = x3 - k * (y2-y1)
y4 = y3 + k * (x2-x1)
Где ^ 2 означает квадрат
Только ради полноты, вот решение с помощью однородных координат.
гомогенные точки:
p1 = (x1, y1,1), p2 = (x2, y2,1), p3 = (x3, y3,1)
строка через две точки является их векторным произведением
l_12: = p1 x p2 = (y1-y2, x2-x1, x1*y2 - x2*y1)
расстояние (со знаком) точки к строке является их скалярным произведением.
d: = l_12 * p3 = x3* (y1-y2) + y3* (x2-x1) + x1*y2 - x2*y1
вектор от p4 до p3 является d временами вектор нормали l_12, разделенного на длину в квадрате вектора нормали.
n2: = (y1-y2) ^2 + (x2-x1) ^2
p4: = p3 + d/n2* (y1-y2, x2-x1, 0)
Примечание: если Вы делите l_12 на длину вектора нормали
l_12: = l_12 / sqrt ((y1-y2) ^2 + (x2-x1) ^2)
расстояние d будет евклидовым расстоянием.
Из wiki :
В алгебре для любого линейного уравнения y = mx + b, все перпендикуляры будут имеют уклон (-1 / м), противоположный обратная первоначальному уклону. Это полезно запомнить слоган «чтобы найти наклон перпендикуляра линию, переверните дробь и измените знак ". Напомним, что любое целое число a сам по себе над одним, и может быть написано as (a / 1)
Чтобы найти перпендикуляр к заданному линия, которая также проходит через в конкретной точке (x, y), решите уравнение y = (-1 / m) x + b, подставив при известных значениях m, x и y до решить для b.
Наклон прямой m, проходящей через (x1, y1) и (x2, y2), равен m = (y1 - y2) / (x1 - x2)
Вы часто обнаруживаете, что использование векторов делает решение более ясным ...
Вот процедура из моей собственной библиотеки:
public class Line2 {
Real2 from;
Real2 to;
Vector2 vector;
Vector2 unitVector = null;
public Real2 getNearestPointOnLine(Real2 point) {
unitVector = to.subtract(from).getUnitVector();
Vector2 lp = new Vector2(point.subtract(this.from));
double lambda = unitVector.dotProduct(lp);
Real2 vv = unitVector.multiplyBy(lambda);
return from.plus(vv);
}
}
Вам придется реализовать Real2 ( точка), Vector2 и dotProduct (), но они должны быть простыми:
Тогда код будет выглядеть примерно так:
Point2 p1 = new Point2(x1, y1);
Point2 p2 = new Point2(x2, y2);
Point2 p3 = new Point2(x3, y3);
Line2 line = new Line2(p1, p2);
Point2 p4 = getNearestPointOnLine(p3);
Библиотека (org.xmlcml.euclid) находится по адресу: http://sourceforge.net/projects/cml/
и есть модульные тесты, которые будут проверять этот метод и показать вам, как его использовать.
@Test
public final void testGetNearestPointOnLine() {
Real2 p = l1112.getNearestPointOnLine(new Real2(0., 0.));
Real2Test.assertEquals("point", new Real2(0.4, -0.2), p, 0.0000001);
}
Вы знаете и точку, и наклон, поэтому уравнение для новой линии:
y-y3=m*(x-x3)
Поскольку прямая перпендикулярна, наклон является обратной величиной. Теперь у вас есть два уравнения, и вы можете решить их пересечение.
y-y3=-(1/m)*(x-x3)
y-y1=m*(x-x1)
Вычислить наклон линии, соединяющей точки (x1, y1) и (x2, y2), как m = (y2-y1) / (x2-x1)
Уравнение линии, соединяющей (x1, y1) и ( x2, y2) с использованием формы линейного уравнения точка-наклон, будет y-y2 = m (x-x2)
Наклон линии, соединяющей (x3, y3) и (x4, y4), будет - (1 / m)
Опять же, уравнение линии, соединяющей (x3, y3) и (x4, y4), с использованием формы линейного уравнения точечного наклона, будет y-y3 = - (1 / m) (x-x3)
Решите эти два линейных уравнения, решая линейное уравнение с двумя переменными, и получаемые вами значения x и y будут вашими (x4, y4)
Надеюсь, это поможет.
ура
Определите уклоны обоих линии, скажем, уклоны m1 и m2, тогда m1 * m2 = -1 - условие для перпендикулярность.