我在编写将执行以下操作的函数时遇到问题:
函数将采用2组坐标(x,y,z)。第一组是起点,第二组是终点。 首先,我必须确定这两点之间的距离。如果距离将大于100,那么我将不得不计算一个临时点。然后,我将计算第一组坐标与此临时点之间的距离。请查看下面的插图我相信事情会更容易理解。
计算点A,B之间新点的函数:
x = (x1+x2/2)
y = (y1+y2/2)
z = (z1+z2/2)
计算距离的函数是:
public float DistanceTo(float x, float y, float z, float x2, float y2, float z2)
{
float a = x - x2;
float b = y - y2;
float c = z - z2;
return Math.Sqrt(a * a + b * b + c * c);
}
链接到插图:
也许我的方法会占用大量CPU并且可能很慢(?)但是目前我不知道如何处理这个问题。
基本上我需要一个函数,如果(距离<100),将以增量从A到B。
感谢您阅读并感谢您发布的任何解决方案!
PS请不要取笑我的绘画技巧:)
答案 0 :(得分:1)
计算从d
(开始)到(xb,yb,zb)
(结束)的距离(xe,ye,ze)
。计算零件数量N=(int)((d-1)/100)+1
。计算
xk = xb + (k*(xe-xb))/N
yk = yb + (k*(ye-yb))/N
zk = zb + (k*(ze-zb))/N
让k=1,...,N-1
在段上获得等距离的点,其距离不超过100
。
答案 1 :(得分:0)
你可以递归地做到
创建一个Point结构,表示R3中的一个点,使用2种实用方法计算距离和中点。
struct Point
{
public double x;
public double y;
public double z;
public double Distance(Point b)
{
return Math.Sqrt(Math.Pow(b.x - this.x, 2) +
Math.Pow(b.y - this.y, 2) +
Math.Pow(b.z - this.z, 2));
}
public Point MidPoint(Point b)
{
return new Point()
{
x = (this.x + b.x) / 2,
y = (this.y + b.y) / 2,
z = (this.z + b.z) / 2
};
}
}
并编写一个简单的递归函数,它将计算距离并递归调用自身,直到a点和临时点之间的距离小于maxSegmentLength,在你的情况下是100:
public static Point GetPoint(Point a, Point b, double maxSegmentLength)
{
var distance = a.Distance(b);
if (distance < maxSegmentLength)
return b;
else
return GetPoint(a, a.MidPoint(b),maxSegmentLength);
}
或者更有效地使用矢量:
struct Vector
{
public double Vx;
public double Vy;
public double Vz;
public double R;
public Vector(Point a,Point b)
{
R = a.Distance(b);
Vx = (b.x - a.x)/R;
Vy = (b.y - a.y)/R;
Vz = (b.z - a.z)/R;
}
}
public static Point GetPoint(Point a, Point b,double maxSegmentLength)
{
var Vab = new Vector(a, b);
var dAC = Vab.R;
while (dAC > maxSegmentLength) { dAC /= 2; } //or replace this line and the one above it with var dAC=Math.Pow(0.5,(int)(-(Math.Log(maxSegmentLength / Vab.R) / Math.Log(2))) + 1)*Vab.R;
return new Point() {
x = a.x + Vab.Vx * dAC ,
y = a.y + Vab.Vy * dAC ,
z = a.z + Vab.Vz * dAC
};
}
答案 2 :(得分:0)
如果该点始终位于中点,则其距离始终为原始距离的一半
public double Calc(Point A, Point B)
{
double d = Distance(A,B);
while(d>100)
{
d/=2;
}
return d;
}