C# Dessin Arc avec 3 Points
J'ai besoin de dessiner un arc à l'aide de GraphicsPath et ayant initiale, médiane et finale des points. L'arc a à passer sur eux.
J'ai essayé .DrawCurve et .DrawBezier mais le résultat n'est pas exactement un arc.
Que puis-je faire?
SOLUTION:
Après une couple d'heures de l'écriture de code, j'ai réussi à dessiner ce que je voulais avec cet algorithme (donner 3 points a,b,c et une GraphicsPath chemin d'accès):
double d = 2 * (a.X - c.X) * (c.Y - b.Y) + 2 * (b.X - c.X) * (a.Y - c.Y);
double m1 = (Math.Pow(a.X, 2) - Math.Pow(c.X, 2) + Math.Pow(a.Y, 2) - Math.Pow(c.Y, 2));
double m2 = (Math.Pow(c.X, 2) - Math.Pow(b.X, 2) + Math.Pow(c.Y, 2) - Math.Pow(b.Y, 2));
double nx = m1 * (c.Y - b.Y) + m2 * (c.Y - a.Y);
double ny = m1 * (b.X - c.X) + m2 * (a.X - c.X);
double cx = nx / d;
double cy = ny / d;
double dx = cx - a.X;
double dy = cy - a.Y;
double distance = Math.Sqrt(dx * dx + dy * dy);
Vector va = new Vector(a.X - cx, a.Y - cy);
Vector vb = new Vector(b.X - cx, b.Y - cy);
Vector vc = new Vector(c.X - cx, c.Y - cy);
Vector xaxis = new Vector(1, 0);
float startAngle = (float)Vector.AngleBetween(xaxis, va);
float sweepAngle = (float)(Vector.AngleBetween(va, vb) + Vector.AngleBetween(vb, vc));
path.AddArc(
(float)(cx - distance), (float)(cy - distance),
(float)(distance * 2), (float)(distance * 2),
startAngle, sweepAngle);
voulez-vous dire un arc de cercle, ou sera toute à l'arc?
circulaire, j'ai oublié d'ajouter que
circulaire, j'ai oublié d'ajouter que
OriginalL'auteur Keeper | 2010-05-24
Vous devez vous connecter pour publier un commentaire.
Je voudrais utiliser
DrawArc()
comme suggéré par ANC_Michael. Pour trouver un arc de cercle qui passe par les 3 points que vous voulez calculer le cercle circonscrit du triangle formé par les points.Une fois que vous avez le cercle circonscrit à calculer une boîte englobante pour le cercle à utiliser avec
DrawArc
à l'aide de la fonction min/max dimensions (centre +/- radius). Maintenant, calculez votre démarrer et arrêter les angles en traduisant les points de sorte que le cercle est centré sur l'origine (traduire par centre) et de prendre le produit scalaire de la normalisée de début et de fin des vecteurs avec l'axe des X:Noter que
DrawArc
s'attend à les angles dans le sens horaire à partir de l'axe des X de sorte que vous devriez ajouterMath.PI
si le calcul de vecteur est au-dessus de l'axe des abscisses. Qui devrait être suffisant pour appelerDrawArc()
.Edit: Cette méthode permettra de trouver un circulaire arc et pas forcément le "meilleur ajustement" de l'arc en fonction de votre comportement de point de terminaison.
OriginalL'auteur Ron Warholic
Avez-vous essayé le DrawArc méthode et de voir si vous pouvez manipuler vos 3 points en quelque sorte?
peut-être
http://msdn.microsoft.com/en-us/library/system.drawing.graphics.drawarc%28VS.71%29.aspx
OriginalL'auteur ANC_Michael