2010-12-12 3 views
2

私は3つの連続ポイント(P1P2P3)を持っているとしましょう、すべての3点を通過する円弧を構築する方法は?3点を与えられ、それらを通過する弧を構築する方法は?

アークは、次の3つのプロパティれている必要があります。

  1. スタートラジアン
  2. 終了ラジアンを
  3. センターポイント
  4. アークが反時計回りに End RadianStart Radianから引き出され

それはP1Start Radianに対応しなければならないとP3end radianに対応しなければならないことを前提としてというだけの理由、私は解決策hereで試してみたが、それは動作しません。しかし現実は、これが常に有効というわけではないということです。

答えて

4

アークを取る順番に従って、それらの間に2行を描きます。両方の線を二分し、それらの法線を思い付いてください。法線の交点は弧の中心です。指定された中心点を使用して、一方の端点から他方の端点まで円弧を描きます。

+0

「1つのエンドポイントからもう1つのエンドポイントまであなたの円弧を描く」、実際には私はここにこだわっています。アークを描く方法は2通りあります。アークを3点すべて通過するようにアークを描く方法は難しいです。 – Graviton

+0

3つのポイントの 'atan2()'を取る。最初の2行があるので、あなたが望む順序を知るでしょう。ラインが上がるまで2 * piを追加してください。 –

+0

@lgnacio、私はあなたのコメントをよく理解していませんが、これについてもっと明白になりますか? – Graviton

0

私は同じ問題がありました。これはCの小さなスニペットです。ご覧のように、中心点には2つの可能な点があります。私はそれが助けて欲しい私のすぐ近くのクレジットイグナシオ:

#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; 
} 
関連する問題