2017-07-03 2 views
0

J'ai cherché Internet et n'a pas trouvé de code pseudo qui a résolu ce problème, je veux trouver un arc entre deux points A et B, en utilisant 5 arguments:Géométrie Arc algorithme

  1. Point de départ
  2. End point
  3. Rayon (Je ne sais pas si cela est nécessaire)
  4. Angle
  5. qualité

Exemple:

img

StartPoint = Le point vert sur la gauche est le Point de départ situé sur les arguments

EndPoint = Le point vert à droite est le point final mis sur la arguments

Angle = Angle de l'Arc (Demi-cercle)

qualité = Combien de cercles rouges cr eate

Je voudrais avoir un code pseudo pour résoudre ce problème

Merci à l'avance: D

+0

quel type d'arc? circulaire, elliptique ...? Qu'en est-il des tangentes de début et de fin? voir [Formule pour tracer des arcs se terminant par des droites, Y en fonction de X, pente de départ, pente de fin, point de départ et rayon d'arc?] (https://stackoverflow.com/a/22982623/2521214) – Spektre

+0

Semi-cercle, aurai-je besoin d'eux? –

+0

si par "eux" vous voulez dire les tangentes alors non. Cela est possible sans eux aussi, mais dans ce cas, la pente de début et de fin sera indéfinie, ce qui peut causer des problèmes pour certaines tâches. Donc, la question est de savoir si vous avez besoin d'une pente de début ou de fin spécifique ou non ... – Spektre

Répondre

0

point de démarrage est Let P0, point final P1, angle Fi. R n'est pas nécessaire

Au premier emplacement, recherchez le centre de l'arc. Obtenez le milieu du segment P0-P1.

M = (P0 + P1)/2 
// M.x = (P0.x + P1.x)/2 , same for y 

direction et de vecteur

D = (P1 - P0)/2 

longueur Get de D

lenD = Math.Hypot(D.x, D.y) //Vector.Length, sqrt of sum of squares 

Get vecteur unitaire

uD = D/lenD 

Get (à gauche) perpendiculaire vecteur

(P.x, P.y) = (-uD.y, ud.x) 

maintenant le cercle central

if F = Pi then 
    C.x = M.x 
    C.y = M.y 
else 
    C.x = M.x + P.x * Len/Tan(Fi/2) 
    C.y = M.y + P.y * Len/Tan(Fi/2) 

vecteur du centre au point de départ:

CP0.x = P0.x - C.x 
CP0.y = P0.y - C.y 

Ensuite, vous pouvez calculer les coordonnées de N points intermédiaires à l'arc en utilisant la rotation du vecteur CP0 autour du point central

an = i * Fi/(NSeg + 1); 
X[i] = C.x + CP0.x * Cos(an) - CP0.y * Sin(an) 
Y[i] = C.y + CP0.x * Sin(an) + CP0.y * Cos(an) 

Fonctionnement Del Code phi

procedure ArcByStartEndAngle(P0, P1: TPoint; Angle: Double; NSeg: Integer); 
var 
    i: Integer; 
    len, dx, dy, mx, my, px, py, t, cx, cy, p0x, p0y, an: Double; 
    xx, yy: Integer; 
begin 
    mx := (P0.x + P1.x)/2; 
    my := (P0.y + P1.y)/2; 

    dx := (P1.x - P0.x)/2; 
    dy := (P1.y - P0.y)/2; 

    len := Math.Hypot(dx, dy); 

    px := -dy/len; 
    py := dx/len; 

    if Angle = Pi then 
    t := 0 
    else 
    t := len/Math.Tan(Angle/2); 

    cx := mx + px * t; 
    cy := my + py * t; 

    p0x := P0.x - cx; 
    p0y := P0.y - cy; 

    for i := 0 to NSeg + 1 do begin 

    an := i * Angle/(NSeg + 1); 
    xx := Round(cx + p0x * Cos(an) - p0y * Sin(an)); 
    yy := Round(cy + p0x * Sin(an) + p0y * Cos(an)); 

    Canvas.Ellipse(xx - 3, yy - 3, xx + 4, yy + 4); 
    end; 
end; 

Résultat pour (Point(100, 0), Point(0, 100), Pi/2, 8 (axe Y vers le bas à l'image)

enter image description here

+0

Eh bien, tout semble bien se passer, mais je suis en train de struger avec la dernière partie la "rotation du vecteur C-P0", pourriez-vous vérifier est correct ? –

+0

Pour un "demi-cercle", le centre est juste le milieu du segment de début. –

+0

@ Mário Gabriel J'ai changé radicalement le poste, vérifié pour le travail. – MBo