求空间一个点到一条直线距离最近的点的坐标C++编程

用类的方法实现,就是公式复杂,应该编程不难,希望高手能花点时间帮帮我,编出来我再补分,要不没人编分就浪费了。非常感谢!
具体已知条件是这样的:已知空间一个点的坐标a(x0,y0,z0),已知空间的另外两个点的坐标b(x1,y1,z1),c(x2,y2,z2),求a点到 b,c两点所在直线的 距离最近的点的坐标 可以说是a点到 过b,c点直线垂足的坐标。并且求出a点到直线的距离。

直线方程为:x-x1/x2-x1=y-y1/y2-y1=z-z1/z2-z1

给出了空间中点P(x0,y0,z0)到直线A1x+B1y+C1z+D1=0A2x+B2y+C2z+D2=0距离的一个公式d=|(A1x0+B1y0+C1z0+D1)n2-(A2x0+B2y0+C2z0+D2)n1|/|n1×n2|,其中ni={Ai,Bi,Ci},(i=1,2)
提供跟多的式子
空间一般直线的方程是:
(x-x0)/a=(y-y0)/b=(z-z0)/c,

这是一条过(x0,y0,z0),方向矢量为{a,b,c}的直线.

假设已知点的坐标是A(e,f,g),过A点,且与{a,b,c}垂直的平面是,

a(x-e)+b(y-f)+c(z-g)=0,直线(x-x0)/a=(y-y0)/b=(z-z0)/c,与这个平面的交点是B,

再由两点的距离公式求出AB

点P(x0,y0,z0)到直线ax+by+cz+d=0的距离
d=abs(a x0+b y0+c z0+d)/sqrt(a^2+b^2+c^2);其中abs是绝对值,sqrt是开根号

谢谢12楼 我都想给分怎么给?

第1个回答  推荐于2016-06-23
我是用C弄的,不过尽量往类那边靠(我用结构,C++还在看)。
你再改一些应当就可以了。

#include <stdio.h>
#include <conio.h>
#include <math.h>

typedef struct{
double x,y,z;
}point;

typedef struct{
point p1,p2;
}line;

main()
{
line lne;
point points[3],point_Q;
int initpoint(point *a,double x,double y,double z);
int printpoint(point a);
int initline(line *l,point a,point b);
int point2line(line l,point a,point *b);
double p2p(point a,point b);

/*初始化三个点,其中前两个点用来做直线的*/
initpoint(&points[0],1,2,3);
initpoint(&points[1],-1,4,6);
initpoint(&points[2],0,0,0);
initline(&lne,points[0],points[1]); /*前两个点做线*/

/*求垂足*/
point2line(lne,points[2],&point_Q);

printpoint(point_Q);/*输出垂足*/
printf("dist=%lf\n",p2p(points[2],point_Q));
getch();
}

int initpoint(point *a,double x,double y,double z)
{
a->x=x;
a->y=y;
a->z=z;
return 1;
}

int printpoint(point a)
{
printf("x=%lf y=%lf z=%lf\n",a.x,a.y,a.z);
}

int initline(line *l,point a,point b)
{
l->p1.x=a.x;
l->p1.y=a.y;
l->p1.z=a.z;

l->p2.x=b.x;
l->p2.y=b.y;
l->p2.z=b.z;
return 1;
}

int point2line(line l,point p,point *Q)
{
double a,b,c;
double A,B,C;

a=l.p2.x-l.p1.x;
b=l.p2.y-l.p1.y;
c=l.p2.z-l.p1.z;

A=a*p.x+b*p.y+c*p.z;
B=b*l.p1.x-a*l.p1.y;
C=c*l.p1.x-a*l.p1.z;

if (a!=0)
{
Q->x=(A*a+B*b+C*c)/(a*a+b*b+c*c);
Q->y=(b*Q->x-B)/a;
Q->z=(c*Q->x-C)/a;
}
else
{
double D,temp;
D=c*l.p1.y-b*l.p1.z;
temp=b*b+c*c;
Q->y=(A*b+D*c)/temp;
Q->z=(A*c-D*b)/temp;
Q->x=(B+a*Q->y)/b;
}

return 1;
}

double p2p(point a,point b)
{
double dx,dy,dz;
dx=a.x-b.x;
dy=a.y-b.y;
dz=a.z-b.z;
return sqrt(dx*dx+dy*dy+dz*dz);
}本回答被提问者采纳
第2个回答  2008-12-16
这个 用向量 最简单了(根本不需要考虑特殊情况,不需要 ,点面距离公式)
设 垂足 为(x,y,z)
向量a(x1-x2,y1-y2,z1-z2)
,b(x0-x,y0-y,z0-z);

垂直则满足
a*b=0

(x1-x2)*(x0-x)+(y1-y2)*(y0-y)+(z1-z2)*(z0-z)=0;//1
(这个方法可以 推广到 N维)

还有 这个 点在点C和点B上
BC的 一般方程是
(x-x0)/a=(y-y0)/b=(z-z0)/c, 这是一条过(x0,y0,z0),方向矢量为{a,b,c}的直线. 把 点 往里面带入
得到3个式子,消元
之后得到 x,y,z的 表达式

这种题目用编程做
实在是 猥琐,
就是考数学的 化解能力
因为 电脑 不知道怎么求解 方程组
只有把 最后的化简的式子输进去,叫他计算结果而已

求空间一个点到一条直线距离最近的点的坐标C++编程
double p2p(point a,point b);\/*初始化三个点,其中前两个点用来做直线的*\/ initpoint(&points[0],1,2,3);initpoint(&points[1],-1,4,6);initpoint(&points[2],0,0,0);initline(&lne,points[0],points[1]); \/*前两个点做线*\/ \/*求垂足*\/ point2line(lne,points[2],&point...

求中点画线算法的c++代码...
直线方程:a*x+b*y+c=0, p1(x1,y1), p2(x2,y2)==> a=y1-y2;b=x2-x1.点到直线的距离:distance=|a*x0-b*y0+c|\/sqrt(a*a + b*b)设directionX,directionY分别为从(x1,y1)==>(x2,y2)的单位变化量(+\/-1)当直线偏向X轴时,当前象素为(xk, yk),下一个象素可能为...

用数据结构编写点到直线的距离公式c++
cout<<"请输入点的纵坐标:";cin>>mypoint.y;cout<<"请输入直线方程的参数A:";cin>>myline.a;cout<<"请输入直线方程的参数B:" ;cin>>myline.b;cout<<"请输入直线方程的参数C:" ;cin>>myline.c;cout<<"点到直线的距离为:"<<(abs(myline.a*mypoint.x+myline.b*mypoint.y+m...

求一C++程序:计算点到直线的距离?
Point P;\/\/这相当于 Point P(0,0);Line L;\/\/相当于 Line L(1,1,1);cout<<dist(P,L)<<endl;return 0;}

C++ mfc 想做一个两点确定一条直线的程序,然后在坐标轴上显示出来,求高...
需要画图,不过也不难,知道两点坐标,然后直接画线连接着两点即可,在这之前可以先把数据轴画好,

C#编写一个程序求直角坐标系中一点到直线的距离。要求如下:_百度知 ...
{ } int getResult(){ int a,b,c,x,y;a = line.getA();b = line.getB();c = line.getC();x = point.getX();y = point.getY();return fabs(a*x+b*y+c)\/sqrt(a*a+b*b);} private:Line line;Point point;};这个是C++的,跟C#应该类似的,你自己尝试一下,我没有试;

C++里直线方程式输入坐标X,Y最后求一个点在Y的的坐标。
"; cin>>x2; cout<<"请输入直线的第2个点的y坐标:"; cin>>y2; cout<<"请输入一个直线上的点的x坐标:"; cin>>x; k=(y2-y1)\/(x2-x1);\/\/斜率 b=y1-k*x1;\/\/截距 cout<<"则该直线上的点的y坐标为:"<<k*x+b<<endl;} ...

编写一个C++程序,判断平面上的一个圆与一条直线的位置关系
cout<<"圆的方程为(x-a)^2+((y-b)^2=c*c,直线方程mx+ny=k ";cout<<"请按顺序输入a,b,c,m,n,k"<<endl;cout<<"a=";cin>>a;cout<<"b=";cin>>b;cout<<"c=";cin>>c;cout<<"m=";cin>>m;cout<<"n=";cin>>n;cout<<"k=";cin>>k;\/\/圆心到直线的垂线为n(x-a...

...点的距离之和最小..求这个距离之和。 最好是c++算法
一个点到另一个点的长度为sqrt((x-x2)^2+(y-y2)^2+(z-z2)^2),那么一个点到多个点的距离之和是很多个这个表达式的重复。那么在计算机中可以这样来实现。定义一个point[][3]来存储n个已知点的坐标用scanf来一个一个输入它们。我们可以想到,到它们最近的点的xyz坐标不可能超过它们的最大...

如何利用matlab求点到直线距离
计算已知空间点P到已知直线L的距离:已知两点确定了一条空间直线,求出直线的方向向量。计算P点与直线L上其中一点的空间向量,然后计算它与直线方向向量的外积。则点到空间直线的距离就是外积的模与空间直线方向向量的模相除。以下为简单的MATLAB代码,输入为空间点P,和直线上的两点:function [ d ] = DisPtToLine(...

相似回答