예제 #1
0
        // пересечение прямой и окружности
        public static List <Point> Intersection(Straight straight, Circle circle)
        {
            List <Point> points = new List <Point>();

            Point circleCenterPoint = circle.getCurvePoint();
            //получение координат центра окружности
            double firstcirclePtX = circleCenterPoint.getX();
            double firstcirclePtY = circleCenterPoint.getY();
            //получение радиуса
            double radius = circle.getRadius();

            Point firstLinePoint = straight.getCurvePoint();
            //получение координат прямой
            double firstLinePtX = firstLinePoint.getX();
            double firstLinePtY = firstLinePoint.getY();
            //получение направляющего вектора прямой
            double firstP1 = straight.getP1();
            double firstP2 = straight.getP2();

            Point zeroPoint   = straight.PointCalcul(0);                        // случайная точка на прямой 1
            Point randomPoint = straight.PointCalcul(new Random().Next(1, 10)); // случайная точка на прямой 2
            // получение центральной точки на прямой
            Point middle = new Point(zeroPoint.getX() - randomPoint.getX(), zeroPoint.getY() - randomPoint.getY());
            //расстояние от центра окружности до центральной точки
            double distance = Math.Abs(middle.getY() * firstcirclePtX + middle.getX() * firstcirclePtY +
                                       (zeroPoint.getY() * randomPoint.getX() - randomPoint.getY() * zeroPoint.getX())) /
                              Math.Sqrt(Math.Pow(middle.getY(), 2) + Math.Pow(middle.getX(), 2));

            // расчет точек
            if (distance <= radius)
            {
                points.Add(new Point(2 * Math.Asin(distance / radius), 2 * Math.Acos(distance / radius)));
                if (distance < radius)
                {
                    points.Add(new Point((2 * Math.Asin(distance / radius) - distance), (2 * Math.Acos(distance / radius) - distance)));
                }
            }

            return(points);
        }
예제 #2
0
        static void Main(string[] args)
        {
            Straight firstStraight  = new Straight(5, 6, 7, 8);
            Straight secondStraight = new Straight(1, 2, 3, 4);

            firstStraight.ClosedCurve();
            firstStraight.PointCalcul(5);
            firstStraight.TangentCalcul(5);

            Circle firstCircle  = new Circle(5, 8, 3);
            Circle secondCircle = new Circle(3, 7, 13);

            firstCircle.ClosedCurve();
            firstCircle.PointCalcul(8);
            firstCircle.TangentCalcul(8);

            printIntersectionPoints("Прямая и прямая", Intersection(firstStraight, secondStraight));
            printIntersectionPoints("Окружность и окружность", Intersection(firstCircle, secondCircle));
            printIntersectionPoints("Прямая и окружность", Intersection(firstStraight, secondCircle));

            Console.ReadKey();
        }
예제 #3
0
        // пересечение двух прямых
        public static List <Point> Intersection(Straight first, Straight second)
        {
            List <Point> points = new List <Point>();

            Point firstLinePoint = first.getCurvePoint();
            // получение координат первой прямой
            double firstLinePtX = firstLinePoint.getX();
            double firstLinePtY = firstLinePoint.getY();
            // получение направляющего вектора первой прямой
            double firstP1 = first.getP1();
            double firstP2 = first.getP2();

            Point secondLinePoint = second.getCurvePoint();
            //получение координат второй прямой
            double secondLinePtX = secondLinePoint.getX();
            double secondLinePtY = secondLinePoint.getY();
            // получение направляющего вектора второй прямой
            double secondP1 = second.getP1();
            double secondP2 = second.getP2();

            // nullone - x0,y0; nulltwo - x01,y01; vector1 - p1,p2; vector2 - p11,p21
            // x = x01+p11*t ; y = y01+p21*t
            // уравнения вида : x=x0+p1*t ; y=y0+p2*t, где x0,yo - точки на прямой, а p1,p2 - направляющий вектор

            // преобразовывает в вид : x-p1*t=x0 ; y-p2*t=y0
            // решаем систему x-p1*t=x0 ; x-p11*t=x01; determinant1 = 1*(-p11)-(-p1)*1;

            double determinant1 = -secondP1 - (-firstP1);
            // решаем систему y-p2*t=y0 ; y-p21*t=y01; determinant1 = 1*(-p21)-(-p2)*1
            double determinant2 = -secondP2 - (-firstP2);

            if (determinant1 != 0 && determinant2 != 0)
            {
                points.Add(new Point((firstLinePtX * (-secondP1) - (-firstP1 * secondLinePtX)) / determinant1,
                                     (secondLinePtY - firstLinePtY) / determinant2));
            }
            return(points);
        }