如果距离超过100,则计算临时坐标

时间:2015-04-14 10:47:43

标签: c# math

我在编写将执行以下操作的函数时遇到问题:

函数将采用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);

        }

链接到插图:

enter image description here

也许我的方法会占用大量CPU并且可能很慢(?)但是目前我不知道如何处理这个问题。

基本上我需要一个函数,如果(距离<100),将以增量从A到B。

感谢您阅读并感谢您发布的任何解决方案!

PS请不要取笑我的绘画技巧:)

3 个答案:

答案 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;
}