Aller au contenu

Aller encore une question (dessin d'arc)


coyotte

Messages recommandés

Bonjour à tous,

 

voici mon nouveau problème.

 

Je voudrais dessiner un arc de cercle, je connais son centre, son point de départ, son point d'arrivée et son rayon.

 

Je n'ai pas trouvé la méthode qui va bien. En effet je ne connais ni son angle de départ, ni son angle d'arrivée.

 

Merci d'avance de toute l'aide que vous voudrez bien m'apporter.

http://www.carpetdiem.net

Plugins pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Invité Patrick

Voilà ce que c'est de pas regarder dans quel forum on est! laugh.gif

Je laisse la main à (gile), y a pas photo... :huh:

Pourtant j'l'aimais bien ma réponse! :P

Lien vers le commentaire
Partager sur d’autres sites

Invité Patrick

J'avais vu ta suggestion de colorisation didier, mais comme je suis abonné à plusieurs dizaines de forums, je doute pouvoir me rappeler de la signification de plusieurs dizaines de couleurs. non, en l’occurrence, il suffisait que je lise le nom du forum, j'ai été trompé par le contenu du message, qui ne pouvait pas évoquer le nom du forum dans lequel il a été posté.

Lien vers le commentaire
Partager sur d’autres sites

coucou"

 

je te rassure, est-ce utile ? d'ailleurs

il m'arrive souvent de commencer une réponse

et de m'apercevoir que je suis hors forum

du style du lisp pour LT

du Covadis pour Mensura

et comme toi à l'instant du bon sens de dessin pour du C# (hihihi)

 

ça se reproduira sans doute encore ...

 

amicalement

Lien vers le commentaire
Partager sur d’autres sites

Salut,

 

Il faut calculer les angles de départ et de fin en fonction du centre et des points de départ et de fin.

 

Pour ce faire, il va falloir utiliser un peu de calcul vectoriel (la classe Autodesk.AutoCAD.Geometry.Vector3d fournit les méthodes), notamment le produit vectoriel qui va indiquer si l'angle de l'arc est inférieur ou supérieur à 180°.

 

Le produit vectoriel du vecteur centre/départ par le vecteur centre/fin retourne le vecteur perpendiculaire à ces deux là (le vecteur normal du plan défini par les 3 points) en considérant le plus petit angle entre les vecteurs.

Donc, si la coordonnée Z du vecteur normal est négative, ça indique que l'angle a été mesuré en sens horaire, par conséquent que l'angle de l'arc est supérieur à 180° (voir une explication en image ici). Dans ce cas il suffit d'utiliser le vecteur inverse (méthode Negate()) du vecteur normal pour les calculs suivants.

 

On obtient un angle entre deux vecteurs 3d avec la méthode Vector3d.GetAngleTo() qui requiert deux paramètres : le vecteur jusqu'au quel mesurer l'angle et un vecteur de référence. Ce dernier est nécessaire pour avoir un angle dans l’intervalle de 0° à 360°, il correspond au vecteur normal du plan sur lequel est mesuré l'angle entre les vecteurs, c'est le vecteur normal qu'on a calculé précédemment.

 

Il reste à voir que faire des situations particulières : si les 3 points sont alignés.

Si les points de départ et de fin sont tous deux du même côté du centre (confondus), il n'est pas possible de dessiner d'arc, il aurait une longueur nulle.

Si les deux points sont situés de part et d'autre du centre (l'arc est un demi-cercle), il manque une donnée : le plan de construction de l'arc. En 2d ce plan est parallèle au plan XY on peut construire l'arc sur ce plan, en 3d on ne peut le déterminer.

 

Un petit exemple commenté

 

private Arc MakeArc(Point3d center, Point3d startPoint, Point3d endPoint, double radius)
{
double startAngle, endAngle;
Vector3d normal = Vector3d.ZAxis;
Vector3d v1 = startPoint - center;
Vector3d v2 = endPoint - center;

// les points de départ et de fin sont alignés du même côte centre (confondus)
if (v1.IsCodirectionalTo(v2))
{
	Application.ShowAlertDialog("Arc de longueur nulle");
	return null;
}

// les points de départ et de fin sont alignés de part et d'autre du centre
if (v1.IsParallelTo(v2))
{
	// si les vecteurs sont parallèles au plan XY, construction 2d arbitraire
	if (v1.Z == v2.Z)
	{
		// calculs des angle par rapport à l'axe X du SCG
		startAngle = Vector3d.XAxis.GetAngleTo(v1, Vector3d.ZAxis);
		endAngle = Vector3d.XAxis.GetAngleTo(v2, Vector3d.ZAxis);
	}
	else
	{
		Application.ShowAlertDialog("Plan de construction indéterminé");
		return null;
	}
}
else
{
	// calcul du vecteur normal du plan
	normal = v1.CrossProduct(v2).GetNormal();

	// correction de la normale si les points sont en sens horaire (angle > 180°)
	if (normal.Z < 0)
		normal = normal.Negate();

	// plan de construction de l'arc
	Plane plane = new Plane(Point3d.Origin, normal);

	// vecteur à partir du quel mesurer les angles (tranformation de l'axe X du plan de construction)
	Vector3d ocsXaxis = Vector3d.XAxis.TransformBy(Matrix3d.PlaneToWorld(plane));

	// calcul des angles
	startAngle = ocsXaxis.GetAngleTo(v1, normal);
	endAngle = ocsXaxis.GetAngleTo(v2, normal);
}
Arc arc = new Arc(center, normal, radius, startAngle, endAngle);
return arc;
}

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Invité Patrick

Mon dieu, mon dieu, mon dieu, et dire que c'est du LISP qu"on se moquait... :blink:

(désolé Gilles, j'ai pas pu m'empêcher... et bravo encore pour l'étendu de ton savoir)

Lien vers le commentaire
Partager sur d’autres sites

Oupss !...

En nettoyant le code, j'ai oublié ça.

C'est réparé. Il suffisait de l'initialiser au début du cade avec :

Vector3d normal = Vector3d.ZAxis;

où la propriété statique ZAxis correspond au vecteur de coordonnée 0,0,1 qui sera utilisé s'il n'est pas recalculé.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Mon dieu, mon dieu, mon dieu, et dire que c'est du LISP qu"on se moquait... :blink:

(désolé Gilles, j'ai pas pu m'empêcher... et bravo encore pour l'étendu de ton savoir)

 

En LISP ça ne serait pas vraiment plus simple, AutoLISP ne fournit pas de fonction de calcul vectoriel, il faut tout implémenter soi même (voir le sujet donné en lien).

J'ai peut-être un peu compliqué la chose en voulant donner une méthode qui ne fonctionne pas qu'en 2d, mais on ne peut échapper au calcul du produit vectoriel (ou d'une méthode équivalente) pour déterminer si les points spécifiés 'tournent' en sens horaire ou trigonométrique, Un arc étant toujours défini en sens trigonométrique.

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Invité Patrick

Ben moi en LISP j'aurais lancé une bonne vieille commande AutoCAD avec un bon vieux (command) de derrière les fagots! ;) Mais bon je suis de la vieille école.

Lien vers le commentaire
Partager sur d’autres sites

Ben moi en LISP j'aurais lancé une bonne vieille commande AutoCAD avec un bon vieux (command) de derrière les fagots! ;) Mais bon je suis de la vieille école.

 

On peut faire ça en NET aussi, mais, comme en LISP, ça a ses limites : ne fonctionne qu'en 2d dans le plan du SCU courant.

 

private void DrawArc(Point3d center, Point3d startPoint, Point3d endPoint, double radius)
{
Document doc = AcAp.DocumentManager.MdiActiveDocument;
string cmd = string.Format(
	"_arc _c {0} {1} {2} ",
	center.ToString().Trim('(', ')'),
	startPoint.Convert2d(new Plane()).ToString().Trim('(', ')'),
	endPoint.Convert2d(new Plane()).ToString().Trim('(', ')'));
doc.SendStringToExecute(cmd, false, false, false);
}

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité