1. 程式人生 > >已知一條線段的兩端點A(x1,y1),B(x2,y2)及線段外的任意一點P(px,py),設計一個程式找出線段中距離p最近的點

已知一條線段的兩端點A(x1,y1),B(x2,y2)及線段外的任意一點P(px,py),設計一個程式找出線段中距離p最近的點

#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();
}