已知一條線段的兩端點A(x1,y1),B(x2,y2)及線段外的任意一點P(px,py),設計一個程式找出線段中距離p最近的點
阿新 • • 發佈:2019-01-06
#include<stdio.h> typedef struct { float x; float y; }Point; typedef struct { Point p1; Point p2; }Line_segment; void initLine (Line_segment &L) { Point p; if(L.p1.x>L.p2.x) { p=L.p1; L.p1=L.p2; L.p2=p; } } Point getNearstPoint(Line_segment L,Point P) { Point nearest_p; float l_k = (L.p1.y-L.p2.y)/(L.p1.x-L.p2.x);//斜率 float v_k = -1/l_k;//與線段垂直的斜率 float h_x = (L.p1.y+v_k*P.x-P.y-l_k*L.p1.x)/(v_k-l_k);//求出線段對應的直線和過p點且與線段對應直線垂直的交點 float h_y =v_k*(h_x-P.x)+P.y; if(h_x>L.p2.x) { //交點的x大於右端端點的x,最近的點就是右端點 nearest_p = L.p2; }else if(h_x<L.p1.x) { //交點的x小於左端端點的x,最近的點就是左端點 nearest_p = L.p1; }else { nearest_p.x=h_x; nearest_p.y = h_y; } return nearest_p; } int main() { Point P; P.x = 1; P.y = 1; Line_segment L; L.p2.x = 1; L.p2.y=3; L.p1.x =0; L.p1.y = 4; initLine(L); Point nearest_p = getNearstPoint(L,P); printf("intersection x is %f,y is %f", nearest_p.x, nearest_p.y); getchar(); }