2015-04-05 2 views
1

У меня есть две точки хранения в двух переменных, которые образуют линию. Я хочу найти точку, перпендикулярную этой линии от одной конечной точки в этой строке.Вычислить точку, перпендикулярную линии

Предположим, что у меня есть две точки P1 (x1, y1) и P2 (x2, y2), тогда я хочу найти третью точку P3, такую, что прямая (P1-P2) перпендикулярна прямой (P2, P3) и пересекается при P2.

+0

Там должен быть еще несколько ограничений (по крайней мере еще один, как расстояние от P1P2), поскольку условия вы упомянули работу для любой точки, лежащей на линии перпендикулярно к P1P2 и проходит через P2. – mushfek0001

+0

Расстояние между перпендикулярной точкой и линией, произвольно ли выбрано? – MCHAppy

ответ

0

Во-первых, угол:

public static double angle (double x1, double y1, double x2, double y2) { 
    double xdiff = x1 - x2; 
    double ydiff = y1 - y2; 
    //double tan = xdiff/ydiff; 
    double atan = Math.atan2(ydiff, xdiff); 
    return atan; 
} 

Чтобы получить перпендикуляра, вы должны добавить PI/2 до угла линии, определяемой вашими двумя точками.

После того как вы этот угол, формула:

x = interceptPt.x + sin(perp_angle) * distance; 
y = interceptPt.y + cos(perp_angle) * distance; 
0

Я получил ответ на http://jsfiddle.net/eLxcB/2/

// Start and end point 
var startX = 120 
var startY = 150 
var endX = 180 
var endY = 130 
R.circle(startX,startY,2); 

// Calculate how far above or below the control point should be 
var centrePointX = startX 
var centrePointY = startY; 

// Calculate slopes and Y intersects 
var lineSlope = (endY - startY)/(endX - startX); 
var perpendicularSlope = -1/lineSlope; 
var yIntersect = centrePointY - (centrePointX * perpendicularSlope); 

// Draw a line between the two original points 
R.path('M '+startX+' '+startY+', L '+endX+' '+endY); 

// Plot some test points to show the perpendicular line has been found 
R.circle(100, (perpendicularSlope * 100) + yIntersect, 2); 
+0

Это код javascript, так почему же тег 'java'? – MCHAppy

+0

Просто получил пример ans, поэтому я преобразовал его в программу Java. Но я разделил исходный пример с небольшими изменениями –

0

Вы можете хранить свои очки в vec2d, а затем использовать некоторые математические уравнения, чтобы получить перпендикулярная точка.

vec2d getPerpendicularPoint(vec2d A, vec2d B, float distance) 
{ 
    vec2d M = (A + B)/2; 
    vec2d p = A - B; 
    vec2d n = (-p.y, p.x); 
    int norm_length = sqrt((n.x * n.x) + (n.y * n.y)); 
    n.x /= norm_length; 
    n.y /= norm_length; 
    return (M + (distance * n)); 
} 
0

Если вы хотите использовать Java, я могу порекомендовать использовать JTS. Создайте LineSegment и используйте метод pointAlongOffset. Учитывая Точку p1 и p2 кода будет выглядеть так:

// create LineSegment 
LineSegment ls = new LineSegment(p1.getX(), p1.getY(), p2.getX(), p2.getY()); 
// perpendicular distance to line 
double offsetDistance = 10; 
// calculate Point right to start point 
Coordinate startRight = ls.pointAlongOffset(0, offsetDistance); 
// calculate Point left to start point 
Coordinate startLeft = ls.pointAlongOffset(0, -offsetDistance); 
// calculate Point right to end point 
Coordinate endRight = ls.pointAlongOffset(1, offsetDistance); 
// calculate Point left to end point 
Coordinate endLeft = ls.pointAlongOffset(1, -offsetDistance); 
Смежные вопросы