예제 #1
0
        public List <LevelLines> GetLevelLines()
        {
            levelLines.Clear();
            foreach (float level in levels)
            {
                foreach (TrianglePotential triangle in triangles)
                {
                    Potential pot1 = new Potential();
                    Potential pot2 = new Potential();
                    Potential pot3 = new Potential();

                    /*Располагаю точки по возрастанию от 1й к 3й*/
                    if (triangle.point1.value >= triangle.point2.value && triangle.point2.value > triangle.point3.value)
                    {
                        pot1 = triangle.point1;
                        pot2 = triangle.point2;
                        pot3 = triangle.point3;
                    }
                    else if (triangle.point1.value >= triangle.point3.value && triangle.point3.value > triangle.point2.value)
                    {
                        pot1 = triangle.point1;
                        pot2 = triangle.point3;
                        pot3 = triangle.point2;
                    }
                    else if (triangle.point2.value >= triangle.point1.value && triangle.point1.value > triangle.point3.value)
                    {
                        pot1 = triangle.point2;
                        pot2 = triangle.point1;
                        pot3 = triangle.point3;
                    }
                    else if (triangle.point2.value >= triangle.point3.value && triangle.point3.value > triangle.point1.value)
                    {
                        pot1 = triangle.point2;
                        pot2 = triangle.point3;
                        pot3 = triangle.point1;
                    }
                    else if (triangle.point3.value >= triangle.point2.value && triangle.point2.value > triangle.point1.value)
                    {
                        pot1 = triangle.point3;
                        pot2 = triangle.point2;
                        pot3 = triangle.point1;
                    }
                    else if (triangle.point3.value >= triangle.point1.value && triangle.point1.value > triangle.point2.value)
                    {
                        pot1 = triangle.point3;
                        pot2 = triangle.point1;
                        pot3 = triangle.point2;
                    }

                    if (level <= pot1.value && level >= pot3.value)
                    {
                        PointF point1 = new PointF();
                        PointF point2 = new PointF();
                        if (level > pot2.value)
                        {
                            point1.X = pot1.point.X -
                                       (pot1.value - level) / (pot1.value - pot2.value) * (pot1.point.X - pot2.point.X);
                            point1.Y = pot1.point.Y -
                                       (pot1.value - level) / (pot1.value - pot2.value) * (pot1.point.Y - pot2.point.Y);
                        }
                        else
                        {
                            point1.X = pot2.point.X -
                                       (pot2.value - level) / (pot2.value - pot3.value) * (pot2.point.X - pot3.point.X);
                            point1.Y = pot2.point.Y -
                                       (pot2.value - level) / (pot2.value - pot3.value) * (pot2.point.Y - pot3.point.Y);
                        }
                        point2.X = pot1.point.X -
                                   (pot1.value - level) / (pot1.value - pot3.value) * (pot1.point.X - pot3.point.X);
                        point2.Y = pot1.point.Y -
                                   (pot1.value - level) / (pot1.value - pot3.value) * (pot1.point.Y - pot3.point.Y);
                        LevelLines ll = new LevelLines {
                            point1 = point1, point2 = point2
                        };
                        levelLines.Add(ll);
                    }
                }
            }
            return(levelLines);
        }
예제 #2
0
        public List <LevelLines> GetForceLines()
        {
            int size_triangles = triangles.Count;
            int size_magnet1   = magnet1.Count;
            int size_magnet2   = magnet2.Count;

            forceLines.Clear();
            for (int i = 0; i < size_magnet1; ++i)
            {
                Potential pot           = magnet1[i];
                PointF    reducentPoint = new PointF();
                reducentPoint = pot.point;


                int num_triangle                 = 0;
                TrianglePotential triangle       = new TrianglePotential();
                PointF            passPoint1     = new PointF();
                PointF            passPoint2     = new PointF();
                PointF            mainPoint      = new PointF();
                PointF            pointIntersect = new PointF(); //точка пересечения
                /*Поиск любого треугольника на границе магнита содержащего точку pot*/
                for (int j = 0; j < size_triangles; j++)
                {
                    if (pot.point == triangles[j].point1.point)
                    {
                        num_triangle = j;
                        passPoint1   = pot.point;
                        passPoint2   = triangles[j].point2.point;
                        mainPoint    = triangles[j].point3.point;
                        break;
                    }
                    if (pot.point == triangles[j].point2.point)
                    {
                        num_triangle = j;
                        passPoint1   = pot.point;
                        passPoint2   = triangles[j].point1.point;
                        mainPoint    = triangles[j].point3.point;
                        break;
                    }
                    if (pot.point == triangles[j].point3.point)
                    {
                        num_triangle = j;
                        passPoint1   = pot.point;
                        passPoint2   = triangles[j].point2.point;
                        mainPoint    = triangles[j].point1.point;
                        break;
                    }
                }
                triangle = triangles[num_triangle];

                float A = -DpDx(triangle.point1, triangle.point2, triangle.point3);
                float B = -DpDy(triangle.point1, triangle.point2, triangle.point3);

                //крайняя точка градиента
                pointIntersect.X = (passPoint1.X + passPoint2.X) / 2;
                pointIntersect.Y = (passPoint1.Y + passPoint2.Y) / 2;
                pot.point        = pointIntersect;
                PointF pot2 = new PointF {
                    X = pot.point.X + A, Y = pot.point.Y + B
                };


                LevelLines line = new LevelLines();

                PointF futureBoardPoint1 = new PointF();     //точки стороны, с которой будет пересечение градиента
                PointF futureBoardPoint2 = new PointF();



                //Пробую найти пересечение с однйо из сторон треугольника
                float ka = 0, kb = 0;
                ka = Ua(mainPoint, passPoint2, pot.point, pot2);
                kb = Ub(mainPoint, passPoint2, pot.point, pot2);
                PointF intersectBuf = new PointF();
                if (ka <= 1 && ka >= 0)
                {
                    intersectBuf.X    = mainPoint.X + ka * (passPoint2.X - mainPoint.X);
                    intersectBuf.Y    = mainPoint.Y + ka * (passPoint2.Y - mainPoint.Y);
                    futureBoardPoint1 = mainPoint;
                    futureBoardPoint2 = passPoint2;
                    reducentPoint     = passPoint1;

                    pointIntersect = intersectBuf;
                    line.point1    = pot.point;
                    line.point2    = pointIntersect;

                    forceLines.Add(line);
                }
                else
                {
                    ka = Ua(mainPoint, passPoint1, pot.point, pot2);
                    kb = Ub(mainPoint, passPoint1, pot.point, pot2);

                    if (ka <= 1 && ka >= 0)
                    {
                        intersectBuf.X    = mainPoint.X + ka * (passPoint1.X - mainPoint.X);
                        intersectBuf.Y    = mainPoint.Y + ka * (passPoint1.Y - mainPoint.Y);
                        futureBoardPoint1 = mainPoint;
                        futureBoardPoint2 = passPoint1;
                        reducentPoint     = passPoint2;

                        pointIntersect = intersectBuf;
                        line.point1    = pot.point;
                        line.point2    = pointIntersect;

                        forceLines.Add(line);
                    }
                }


                for (int z = 0; z < 200; z++)
                {
                    triangle   = new TrianglePotential();
                    passPoint1 = new PointF();
                    passPoint2 = new PointF();
                    mainPoint  = new PointF();
                    /*Поиск любого треугольника содержащего точки futureBoardPoints*/
                    for (int j = 0; j < size_triangles; j++)
                    {
                        TrianglePotential tr = new TrianglePotential();
                        tr = triangles[j];
                        if (futureBoardPoint1 == tr.point1.point && futureBoardPoint2 == tr.point2.point && reducentPoint != tr.point3.point)
                        {
                            num_triangle = j;
                            passPoint1   = tr.point1.point;
                            passPoint2   = tr.point2.point;
                            mainPoint    = tr.point3.point;
                        }
                        if (futureBoardPoint1 == tr.point1.point && futureBoardPoint2 == tr.point3.point && reducentPoint != tr.point2.point)
                        {
                            num_triangle = j;
                            passPoint1   = tr.point1.point;
                            passPoint2   = tr.point3.point;
                            mainPoint    = tr.point2.point;
                        }
                        if (futureBoardPoint1 == tr.point2.point && futureBoardPoint2 == tr.point1.point && reducentPoint != tr.point3.point)
                        {
                            num_triangle = j;
                            passPoint1   = tr.point2.point;
                            passPoint2   = tr.point1.point;
                            mainPoint    = tr.point3.point;
                        }
                        if (futureBoardPoint1 == tr.point2.point && futureBoardPoint2 == tr.point3.point && reducentPoint != tr.point1.point)
                        {
                            num_triangle = j;
                            passPoint1   = tr.point2.point;
                            passPoint2   = tr.point3.point;
                            mainPoint    = tr.point1.point;
                        }
                        if (futureBoardPoint1 == tr.point3.point && futureBoardPoint2 == tr.point2.point && reducentPoint != tr.point1.point)
                        {
                            num_triangle = j;
                            passPoint1   = tr.point3.point;
                            passPoint2   = tr.point2.point;
                            mainPoint    = tr.point1.point;
                        }
                        if (futureBoardPoint1 == tr.point3.point && futureBoardPoint2 == tr.point1.point && reducentPoint != tr.point2.point)
                        {
                            num_triangle = j;
                            passPoint1   = tr.point1.point;
                            passPoint2   = tr.point3.point;
                            mainPoint    = tr.point2.point;
                        }
                    }

                    triangle = triangles[num_triangle];

                    A = -DpDx(triangle.point1, triangle.point2, triangle.point3);
                    B = -DpDy(triangle.point1, triangle.point2, triangle.point3);

                    pot.point = pointIntersect;
                    pot2.X    = pot.point.X + A;
                    pot2.Y    = pot.point.Y + B;



                    //Пробую найти пересечение с однйо из сторон треугольника
                    ka           = 0; kb = 0;
                    ka           = Ua(mainPoint, passPoint2, pot.point, pot2);
                    kb           = Ub(mainPoint, passPoint2, pot.point, pot2);
                    intersectBuf = new PointF();
                    if (ka <= 1 && ka >= 0)
                    {
                        intersectBuf.X    = mainPoint.X + ka * (passPoint2.X - mainPoint.X);
                        intersectBuf.Y    = mainPoint.Y + ka * (passPoint2.Y - mainPoint.Y);
                        futureBoardPoint1 = mainPoint;
                        futureBoardPoint2 = passPoint2;
                        reducentPoint     = passPoint1;

                        pointIntersect = intersectBuf;
                        line.point1    = pot.point;
                        line.point2    = pointIntersect;

                        forceLines.Add(line);
                    }
                    else
                    {
                        ka = Ua(mainPoint, passPoint1, pot.point, pot2);
                        kb = Ub(mainPoint, passPoint1, pot.point, pot2);

                        if (ka <= 1 && ka >= 0)
                        {
                            intersectBuf.X    = mainPoint.X + ka * (passPoint1.X - mainPoint.X);
                            intersectBuf.Y    = mainPoint.Y + ka * (passPoint1.Y - mainPoint.Y);
                            futureBoardPoint1 = mainPoint;
                            futureBoardPoint2 = passPoint1;
                            reducentPoint     = passPoint2;



                            pointIntersect = intersectBuf;
                            line.point1    = pot.point;
                            line.point2    = pointIntersect;

                            forceLines.Add(line);
                        }
                    }
                }
            }
            for (int i = 0; i < size_magnet2; ++i)
            {
                Potential pot           = magnet2[i];
                PointF    reducentPoint = new PointF();
                reducentPoint = pot.point;

                // if (pot.value > 0)
                // {
                int num_triangle                 = 0;
                TrianglePotential triangle       = new TrianglePotential();
                PointF            passPoint1     = new PointF();
                PointF            passPoint2     = new PointF();
                PointF            mainPoint      = new PointF();
                PointF            pointIntersect = new PointF(); //точка пересечения
                /*Поиск любого треугольника на границе магнита содержащего точку pot*/
                for (int j = 0; j < size_triangles; j++)
                {
                    if (pot.point == triangles[j].point1.point)
                    {
                        num_triangle = j;
                        passPoint1   = pot.point;
                        passPoint2   = triangles[j].point2.point;
                        mainPoint    = triangles[j].point3.point;
                        break;
                    }
                    if (pot.point == triangles[j].point2.point)
                    {
                        num_triangle = j;
                        passPoint1   = pot.point;
                        passPoint2   = triangles[j].point1.point;
                        mainPoint    = triangles[j].point3.point;
                        break;
                    }
                    if (pot.point == triangles[j].point3.point)
                    {
                        num_triangle = j;
                        passPoint1   = pot.point;
                        passPoint2   = triangles[j].point2.point;
                        mainPoint    = triangles[j].point1.point;
                        break;
                    }
                }
                triangle = triangles[num_triangle];

                float A = -DpDx(triangle.point1, triangle.point2, triangle.point3);
                float B = -DpDy(triangle.point1, triangle.point2, triangle.point3);

                //крайняя точка градиента
                pointIntersect.X = (passPoint1.X + passPoint2.X) / 2;
                pointIntersect.Y = (passPoint1.Y + passPoint2.Y) / 2;
                pot.point        = pointIntersect;
                PointF pot2 = new PointF {
                    X = pot.point.X + A, Y = pot.point.Y + B
                };


                LevelLines line = new LevelLines();

                PointF futureBoardPoint1 = new PointF();     //точки стороны, с которой будет пересечение градиента
                PointF futureBoardPoint2 = new PointF();



                //Пробую найти пересечение с однйо из сторон треугольника
                float ka = 0, kb = 0;
                ka = Ua(mainPoint, passPoint2, pot.point, pot2);
                kb = Ub(mainPoint, passPoint2, pot.point, pot2);
                PointF intersectBuf = new PointF();
                if (ka <= 1 && ka >= 0)
                {
                    intersectBuf.X    = mainPoint.X + ka * (passPoint2.X - mainPoint.X);
                    intersectBuf.Y    = mainPoint.Y + ka * (passPoint2.Y - mainPoint.Y);
                    futureBoardPoint1 = mainPoint;
                    futureBoardPoint2 = passPoint2;
                    reducentPoint     = passPoint1;

                    pointIntersect = intersectBuf;
                    line.point1    = pot.point;
                    line.point2    = pointIntersect;

                    forceLines.Add(line);
                }
                else
                {
                    ka = Ua(mainPoint, passPoint1, pot.point, pot2);
                    kb = Ub(mainPoint, passPoint1, pot.point, pot2);

                    if (ka <= 1 && ka >= 0)
                    {
                        intersectBuf.X    = mainPoint.X + ka * (passPoint1.X - mainPoint.X);
                        intersectBuf.Y    = mainPoint.Y + ka * (passPoint1.Y - mainPoint.Y);
                        futureBoardPoint1 = mainPoint;
                        futureBoardPoint2 = passPoint1;
                        reducentPoint     = passPoint2;

                        pointIntersect = intersectBuf;
                        line.point1    = pot.point;
                        line.point2    = pointIntersect;

                        forceLines.Add(line);
                    }
                }


                for (int z = 0; z < 200; z++)
                {
                    triangle   = new TrianglePotential();
                    passPoint1 = new PointF();
                    passPoint2 = new PointF();
                    mainPoint  = new PointF();
                    /*Поиск любого треугольника содержащего точки futureBoardPoints*/
                    for (int j = 0; j < size_triangles; j++)
                    {
                        TrianglePotential tr = new TrianglePotential();
                        tr = triangles[j];
                        if (futureBoardPoint1 == tr.point1.point && futureBoardPoint2 == tr.point2.point && reducentPoint != tr.point3.point)
                        {
                            num_triangle = j;
                            passPoint1   = tr.point1.point;
                            passPoint2   = tr.point2.point;
                            mainPoint    = tr.point3.point;
                        }
                        if (futureBoardPoint1 == tr.point1.point && futureBoardPoint2 == tr.point3.point && reducentPoint != tr.point2.point)
                        {
                            num_triangle = j;
                            passPoint1   = tr.point1.point;
                            passPoint2   = tr.point3.point;
                            mainPoint    = tr.point2.point;
                        }
                        if (futureBoardPoint1 == tr.point2.point && futureBoardPoint2 == tr.point1.point && reducentPoint != tr.point3.point)
                        {
                            num_triangle = j;
                            passPoint1   = tr.point2.point;
                            passPoint2   = tr.point1.point;
                            mainPoint    = tr.point3.point;
                        }
                        if (futureBoardPoint1 == tr.point2.point && futureBoardPoint2 == tr.point3.point && reducentPoint != tr.point1.point)
                        {
                            num_triangle = j;
                            passPoint1   = tr.point2.point;
                            passPoint2   = tr.point3.point;
                            mainPoint    = tr.point1.point;
                        }
                        if (futureBoardPoint1 == tr.point3.point && futureBoardPoint2 == tr.point2.point && reducentPoint != tr.point1.point)
                        {
                            num_triangle = j;
                            passPoint1   = tr.point3.point;
                            passPoint2   = tr.point2.point;
                            mainPoint    = tr.point1.point;
                        }
                        if (futureBoardPoint1 == tr.point3.point && futureBoardPoint2 == tr.point1.point && reducentPoint != tr.point2.point)
                        {
                            num_triangle = j;
                            passPoint1   = tr.point1.point;
                            passPoint2   = tr.point3.point;
                            mainPoint    = tr.point2.point;
                        }
                    }

                    triangle = triangles[num_triangle];

                    A = -DpDx(triangle.point1, triangle.point2, triangle.point3);
                    B = -DpDy(triangle.point1, triangle.point2, triangle.point3);

                    pot.point = pointIntersect;
                    pot2.X    = pot.point.X + A;
                    pot2.Y    = pot.point.Y + B;



                    //Пробую найти пересечение с однйо из сторон треугольника
                    ka           = 0; kb = 0;
                    ka           = Ua(mainPoint, passPoint2, pot.point, pot2);
                    kb           = Ub(mainPoint, passPoint2, pot.point, pot2);
                    intersectBuf = new PointF();
                    if (ka <= 1 && ka >= 0)
                    {
                        intersectBuf.X    = mainPoint.X + ka * (passPoint2.X - mainPoint.X);
                        intersectBuf.Y    = mainPoint.Y + ka * (passPoint2.Y - mainPoint.Y);
                        futureBoardPoint1 = mainPoint;
                        futureBoardPoint2 = passPoint2;
                        reducentPoint     = passPoint1;

                        pointIntersect = intersectBuf;
                        line.point1    = pot.point;
                        line.point2    = pointIntersect;

                        forceLines.Add(line);
                    }
                    else
                    {
                        ka = Ua(mainPoint, passPoint1, pot.point, pot2);
                        kb = Ub(mainPoint, passPoint1, pot.point, pot2);

                        if (ka <= 1 && ka >= 0)
                        {
                            intersectBuf.X    = mainPoint.X + ka * (passPoint1.X - mainPoint.X);
                            intersectBuf.Y    = mainPoint.Y + ka * (passPoint1.Y - mainPoint.Y);
                            futureBoardPoint1 = mainPoint;
                            futureBoardPoint2 = passPoint1;
                            reducentPoint     = passPoint2;



                            pointIntersect = intersectBuf;
                            line.point1    = pot.point;
                            line.point2    = pointIntersect;

                            forceLines.Add(line);
                        }
                    }
                }


                //  }
            }
            return(forceLines);
        }