Пример #1
0
        private void GetTempPoint(int p1, int p2, int p3, int p4)
        {
            if (Distance[p1] < 0 || Distance[p2] < 0 || Distance[p3] < 0 || Distance[p4] < 0)
            {
                return;
            }

            MyPointD myPoint = GetThirdPoint(p1, p2, p3);

            if (myPoint.flag == 1)
            {
                temptPoint[TempCount] = myPoint;
                TempCount++;
            }
        }
Пример #2
0
        private MyPointD GetThirdPoint(int p1, int p2, int p3)
        {
            float d3 = GetDistance(Anchor[p1], Anchor[p2]);
            float d1 = Distance[p1];
            float d2 = Distance[p2];
            float t;

            MyPointD p3a = new MyPointD();
            MyPointD p3b = new MyPointD();

            p3a.flag = 0;
            p3b.flag = 0;

            // 处理三个距离值无法形成一个三角形的情况,如果误差值在范围内,认为三点一直线
            if (d1 > d2 + d3)
            {
                if (d1 < (d2 + d3) * DeviationRate)
                {
                    t        = (d1 / d3);
                    p3a.X    = Anchor[p1].X + (Anchor[p2].X - Anchor[p1].X) * t;
                    p3a.Y    = Anchor[p1].Y + (Anchor[p2].Y - Anchor[p1].Y) * t;
                    p3a.flag = 1;
                }
                return(p3a);
            }
            if (d2 > d1 + d3)
            {
                if (d2 < (d1 + d3) * DeviationRate)
                {
                    t        = (d1 / d3);
                    p3a.X    = Anchor[p2].X + (Anchor[p1].X - Anchor[p2].X) * t;
                    p3a.Y    = Anchor[p2].Y + (Anchor[p1].Y - Anchor[p2].Y) * t;
                    p3a.flag = 1;
                }
                return(p3a);
            }
            if (d3 > d1 + d2)
            {
                if (d3 < (d1 + d2) * DeviationRate)
                {
                    t = d1 / d2;
                    //p3a.X = Anchor[p1].X + (Anchor[p2].X - Anchor[p1].X) * t;
                    p3a.X = Anchor[p1].X + (Anchor[p2].X - Anchor[p1].X) * d1 / (d1 + d2);
                    p3a.Y = Anchor[p1].Y + (Anchor[p2].Y - Anchor[p1].Y) * d1 / (d1 + d2);
                    //p3a.Y = Anchor[p1].Y + (Anchor[p2].Y - Anchor[p1].Y) * t;
                    p3a.flag = 1;
                }
                return(p3a);
            }

            //计算d1和d3形成的夹角
            float A = ArcCos(System.Convert.ToSingle((d1 * d1 + d3 * d3 - d2 * d2) / (2 * d1 * d3)));

            // 计算第一种可能的第3点坐标
            t = (float)(A + ArcCos(System.Convert.ToSingle((Anchor[p1].Y - Anchor[p2].Y) / d3)) - 2 * Math.Atan(1));

            //计算d1与横坐标的夹角
            if (Anchor[p1].X < Anchor[p2].X)
            {
                p3a.X = (float)(Anchor[p1].X + d1 * Math.Cos(t));
            }
            else
            {
                p3a.X = (float)(Anchor[p1].X - d1 * Math.Cos(t));
            }
            p3a.Y    = (float)(Anchor[p1].Y + d1 * Math.Sin(t));
            p3a.flag = 1;

            // 计算第二种可能的第3点坐标
            t = (float)(A - ArcCos(System.Convert.ToSingle((Anchor[p1].Y - Anchor[p2].Y) / d3)) + 2 * Math.Atan(1));

            //计算d1与横坐标的夹角
            if (Anchor[p1].X < Anchor[p2].X)
            {
                p3b.X = (float)(Anchor[p1].X + d1 * Math.Cos(t));
            }
            else
            {
                p3b.X = (float)(Anchor[p1].X - d1 * Math.Cos(t));
            }
            p3b.Y    = (float)(Anchor[p1].Y - d1 * Math.Sin(t));
            p3b.flag = 1;

            // 选有效点返回 如果两个点有效 则选择与测量值接近的点
            if (p3b.flag == 1 || p3a.flag == 1)
            {
                return(GetDistance(p3a, Anchor[p3]) - Distance[p3] < GetDistance(p3b, Anchor[p3]) - Distance[p3]
                    ? p3a
                    : p3b);
            }
            return(p3a);
        }
Пример #3
0
 private float GetDistance(MyPointD p1, MyPointD p2)
 {
     return(System.Convert.ToSingle(System.Math.Sqrt((p1.X - p2.X) * (p1.X - p2.X) + (p1.Y - p2.Y) * (p1.Y - p2.Y))));
 }