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); }
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); }