Учитывая 3 балла, как построить дугу, которая проходит через них? - PullRequest
2 голосов
/ 12 декабря 2010

Допустим, у меня есть 3 последовательные точки (P1, P2, P3), как построить Дугу, которая проходит через все 3 точки?

Дуга должна иметь следующие 3 свойства:

  1. Старт Радиан
  2. End Radian
  3. Центральная точка

Дуга оттянута от Start Radian до End Radian против часовой стрелки.

Я пробовал с решением здесь , но оно не работает, просто потому, что предполагается, что P1 должно соответствовать Start Radian и P3 должно соответствовать end radian. Но реальность такова, что это не всегда верно.

Ответы [ 2 ]

4 голосов
/ 12 декабря 2010

Нарисуйте две линии между ними, следуя порядку, который вы хотите, чтобы дуга взяла.Разделите пополам обе линии, придумывая их нормали.Пересечение нормалей является центром дуги.Проведите свою дугу от одной конечной точки к другой, с указанным центром.

0 голосов
/ 07 апреля 2016

У меня была такая же проблема.Вот небольшой фрагмент кода на C для этого.Как вы можете видеть, есть две возможные точки для центральной точки.Я надеюсь, что это помогает.Кредиты моему скоро Игнасио:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main(void)
{
    float x1,y1; //Punto A
    float x2,y2; //Punto B
    float x3,y3; //Punto medio
    float x,y;
    float z,t; //los otros posibles puntos
    float R; //Distancia

    printf("Introduce  Ax:\n");
    scanf ("%f",&x1);
    printf("Introduce  Ay:\n");
    scanf ("%f",&y1);
    printf("Introduce  Bx:\n");
    scanf ("%f",&x2);
    printf("Introduce  By:\n");
    scanf ("%f",&y2);
    printf("Introduce  Cx:\n");
    scanf ("%f",&x3);
    printf("Introduce  Cy:\n");
    scanf ("%f",&y3);
    printf("Introduce la distancia:\n");
    scanf ("%f",&R);


    x=-((-(x2*x2)+2*x1*x2-(x1*x1))*x3-(x3*y1*y1)+(2*x3*y1*y2)-(x3*y2*y2)+(y2-y1)*sqrt(y2*y2-2*y1*y2+y1*y1+x2*x2-2*x1*x2+x1*x1)*R)/(y2*y2-2*y1*y2+y1*y1+x2*x2-2*x1*x2+x1*x1);
    y=((y2*y2-2*y1*y2+y1*y1+x2*x2-2*x1*x2+x1*x1)*y3+(x2-x1)*sqrt(y2*y2-2*y1*y2+y1*y1+x2*x2-2*x1*x2+x1*x1)*R)/(y2*y2-2*y1*y2+y1*y1+x2*x2-2*x1*x2+x1*x1);
    printf ("x=%f\n",x);
    printf ("y=%f\n",y);

    z=((y2-y1)*sqrt((y2*y2)-2*y1*y2+y1*y1+x2*x2-2*x1*x2+x1*x1)*R+x3*y2*y2-2*x3*y1*y2+x3*y1*y1+(x2*x2-2*x1*x2+x1*x1)*x3)/(y2*y2-2*y1*y2+y1*y1+x2*x2-2*x1*x2+x1*x1);
    t=-((x2-x1)*sqrt(y2*y2-2*y1*y2+y1*y1+x2*x2-2*x1*x2+x1*x1)*R+(-(y2*y2)+2*y1*y2-(y1*y1)-(x2*x2)+2*x1*x2-(x1*x1)*y3))/(y2*y2-2*y1*y2+y1*y1+x2*x2-2*x1*x2+x1*x1);
    printf ("\nx=%f\n",z);
    printf ("y=%f\n",t);
    system("pause");

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...