Aller au contenu

A vos compas!


Invité Patrick

Messages recommandés

Posté(e)

Un problème de géométrie intéressant soulevé par un utilisateur CAO (Tom), sur le forum Planetar:

 

1\ la largeur du petit rectangle, par exemple 10 unités.

2\ je veux que chaque sommet du petit rectangle soit situé sur un côté différent du grand rectangle, et ce quel que soit le grand rectangle initial.

 

La solution peut être manuelle, mathématique ou algorithmique de façon à être implémentée en Lisp ou VBA par exemple.

 

Aucune solution n'a été trouvée pour l'instant...

 

images/articles/rectang.jpg

 

Posté(e)

oK

 

homothétie et rotation ...

 

tout ça pour dire que le petit triangle dans le coin est le meme triangle que celui formé par L, l et la diagonale du grand rectangle..... Bon il faut faire _scale du rectangle, et la diagonale devient 10, on tourne et on place dans les coins. Ca doit pas etre trop dur pour des pros du lisp comme vouzotes ! Moi je ne connais pas cette langue vernaculaire ...

 

je voulais mettre une belle image, mais la nouvelle FAQ me dit que je peut pas, et comme j'ai pas de site perso ni de ftp, bah tampi !

 

Posté(e)

Je ne pense pas...

 

images/articles/rectangle_impossible_01.png

Posté(e)

Remarque sur les messages et les réponses:

 

Ne modifiez pas vos messages si quelqu'un y a déjà répondu, car les réponses ultérieures ne veulent plus rien dire!

 

extrusion: je répondais à ton premier message sur ce fil de discussion qui disait que les deux autres coté du triangle d'hypothénuse 10 faisaient forcément 8 et 6, sur ma copie d'écran, ce n'est pas le cas.

Posté(e)

Essayons par les maths....

 

Soient :

L la largeur du grand rectangle, vert sur l'image de Patrick

H la hauteur de ce même rectangle

l la largeur du petit rectangle, bleu sur l'image de Patrick

h la hauteur de ce même rectangle, 10 sur l'image de Patrick

x le petit coté du petit triangle du coin, 5.49 sur l'image de Patrick

y le grand coté du petit triangle du coin, 8.36 sur l'image de Patrick

a le petit angle du triangle

 

On sait que :

h² = x² + y²

x = h.sin(a)

y = h.cos(a)

l² = (H-y)² + (L-x)²

L = h.cos(a) + l.sin(a)

H = h.sin(a) + l.cos(a)

 

Alors :

l² = H² - 2.H.y + y² + L² - 2.L.x + x²

l² = H² + L² + x² + y² - 2.(H.y + L.x)

l² = H² + L² + h² - 2.((h.sin(a) + l.cos(a)).h.cos(a) + (h.cos(a) + l.sin(a)).h.sin(a))

l² = H² + L² + h² - 2.h.(h.sin(a).cos(a) + l.cos²(a) + h.cos(a).sin(a) + l.sin²(a))

l² = H² + L² + h² - 2.h.(l + 2.h.sin(a).cos(a))

l² = H² + L² + h² - 2.h.(l + h.sin(2.a))

2.h.(l + h.sin(2.a)) = H² + L² + h² - l²

l + h.sin(2.a) = (H² + L² + h² - l²)/(2.h)

h.sin(2.a) = (H² + L² + h² - l² - 2.h.l)/(2.h)

sin(2.a) = (H² + L² + h² - l² - 2.h.l)/(2.h²)

 

On exprime donc a en fonction des 4 dimensions connues L, H, l et h.

 

En espérant que cela réponde à la question et que je n'ai pas fait d'erreur ...

Ciao :cool:

Posté(e)

Sauf erreur de ma pars, on a 3 donnée et 2 inconnue:

H, L et h sont connue

par contre a et l sont des inconnues donc la formule n'est pas résolvable..

Malheureusement sinon c'était surement la solution.

Posté(e)

Si a et l sont inconnues, il y a plus d'une solution, voire p't être même une infinité.

 

Il faut donc en fixer une, a ou l.

 

Si l est l'inconnue, il faut r'bidouiller les équations de départ pour l'isoler.

Ciao :cool:

Posté(e)

Dans le problème posé par l'auteur du message original, il était spécifié que la largeur du petit rectangle est une constante de valeur 10.

Posté(e)

bonsoir

ben voilà qu'on récupère les questions du serveur de news,

c'est parfait, comme ça on va échanger,

j'essaie de me libérer ce soir pour cogiter

et je reviens à la charge demain,

j'imagine une solution, mais faut que je la précise.

à demain les gars, et les filles aussi ...

il en va de " l'honneur" de CadXp, hihihihihi

amicalement

 

Posté(e)

bonjour

ben alors,y'a pas encore de réponses ?

déjà que ça ferme tôt ici en plus ça ouvre tard.

moi je propose ça,

les vérifs de faisabilité sont rajoutées in extremis

c'est encore à peaufiner,

mais l'essentiel est là :

(setvar "orthomode" 0)

(setvar "osmode" 0)

(setvar "plinewid" 0)

(setq p1 (getpoint"\nPoint de Base\n"))

(setq p2 (getpoint p1"\n\tDirection du premier Rectangle\n"))

(setq dir (angle p1 p2))

(setq p3 (polar p1 (+ dir ( / pi 2)) 10 ))

(setq p4 (polar p2 (+ dir ( / pi 2)) 10 ))

(setvar "cecolor" "4")

(command "_pline" p1 p3 p4 p2 "c")

 

 

(setq p11 (getpoint p1"\n\tDirection du DEUXIEME Rectangle\n"))

(setq dir2 (angle p1 p11))

(setq test ( - dir dir2))

 

(while (or

(and ( test -1.5708))

(and ( test -4.71239))

)

(progn

(alert"impossible !!")

(setq p11 (getpoint p1"\n\tDirection du DEUXIEME Rectangle\n")

dir2 (angle p1 p11)

test ( - dir dir2)

)

)

)

 

 

(setq p22 (polar p2 (- dir2 ( / pi 2)) 10))

(setq p33 (polar p3 ( - dir2 ( / pi 2)) 10))

(setq p44 (polar p4 dir2 10))

(setq pbd (inters p1 p11 p2 p22 nil))

(setq phd (inters p2 p22 p4 p44 nil))

(setq phg (inters p3 p33 p4 p44 nil))

(setq pbg (inters p1 p11 p3 p33 nil))

(setvar "cecolor" "1")

(command "_pline" pbd phd phg pbg "c")

(setvar "cecolor" "256")

)

j'espère être mis au courant si ça convient ou pas

allez moi je pars sur le terrain

je repasse ce soir, pour voir les différentes versions

ciao

Posté(e)

Didier, le problème était de créer le petit rectangle, après avoir créé le grand.

Posté(e)

Désolé Patrick, mais j'avais vu mon erreur dans la minute, et je ne pouvais pas la laisser !

Par contre j'en suis là, avec des tortures du passé :

 

L longeur

l largeur

x le coté du petit triangle d'hyp 10

y l'autre coté de ce triangle

 

XX + YY = 100

(L-x)/y = (l-y)/x

x = (yl + 100)/L

 

 

il y avait bien de l'homothétie, mais je ne l'ai pas démontrée... juste remarquée par le dessin.

 

 

Posté(e)

La dernière équation n'est pas bonne :

 

x²+y²=100

 

(L-x)/y=(l-y)/x donc (L-x)x = (l-y)y -> Lx-x² = ly-y² -> Lx-ly = x²-y² et non pas x²+y²

 

sauf erreur de ma part.

 

J'arrive donc à une équation :

 

rac = racine

 

ly-L.rac(100-y²)+100-2y²=0 Bon courage à ceux qui voudrait la simplifiée!

Le DOC

Posté(e)

eheheheheheheheh

il est tout content le didier,

il a une solution

il a pensé à ça aujourd'hui,

c'est simple comme tout,

il se fait peut être des idées,

mais il s'y colle ce soir dès qu'il rentre dans sa maison personnelle à lui même,

eh oui, il est encore au boulot à vingt heures, pas vous ?

 

donc, disai-je, je m'y colle en rentrant et si c'est comme je pense,

 

on aura encore reculé les limites du sublime,

 

en toute modestie, vous me connaissez maintenant.

à demain pour des nouvelles, bonnes, j'espère :P

amicalement

 

Posté(e)

coucou,

ben, je m'aperçois que le fait que je suis sur le point de proposer

une solution vous laisse tous froids.

je n'ai pas oublié, de poster ma réponse,

mais n'ayant pas Internet à la maison,

je ne suis pas encore en mesure de la poster,

elle est bien avancée, mais j'aimerai peaufiner.

je me berce de douces illusions, en me persuadant

que ça vous intéresse.

snif snif

vu que le degré d'urgence de la réponse n'est pas critique,

je vais prendre le temps de faire ça bien.

mais amicalement quand même.

Posté(e)

Hello Didier, mais si cela m'interese !

Je pense que je ne suis pas loin de trouver...mais pas en lisp ou autre..juste en calcul.

Je suis en train de me faire un peu mal avec des équations de cercle...c'est loin tout ça !

Invité Patrick
Posté(e)

Pour info, la suite de ce problème est discutée par Didier sur le forum LISP car il propose une solution en LISP.

Posté(e)

Salut à tous

 

Ben j'ai pas trouvé de solution autre que par itération (comme Kamal et Didier)

J'ai essayé d' établir une fourchette de recherche en augmentant la précision lors de l'approche du résultat.

Donc cette routine sera plus rapide que la boucle de la mort de Didier ;)

La gestion des erreurs est peut être aussi plus complète.

 

(defun c:rec_inscrit ( / ent ent_rec ptlst old_icusc l h l1 h1 h2 old_osm da db n alpha p1 p2 p3 p4 flag)
(setvar "cmdecho" 0)
(while (null (setq ent (entsel "\nSélectionner un rectangle: "))))
(setq ent_rec (entget (car ent)))
(cond
	((eq (cdr (assoc 0 ent_rec)) "LWPOLYLINE")
		(setq ptlst (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) ent_rec)))
		(setq old_icusc (getvar "UCSICON"))
		(setvar "UCSICON" 0)
		(command "_.ucs" "_object" (cadr ent))
		(setq ptlst (list (trans (car ptlst) 0 1) (trans (cadr ptlst) 0 1) (trans (caddr ptlst) 0 1) (trans (cadddr ptlst) 0 1)))
		(setq ptlst
			(list
				(list (eval (cons min (mapcar 'car ptlst))) (eval (cons min (mapcar 'cadr ptlst))))
				(list (eval (cons max (mapcar 'car ptlst))) (eval (cons min (mapcar 'cadr ptlst))))
				(list (eval (cons max (mapcar 'car ptlst))) (eval (cons max (mapcar 'cadr ptlst))))
				(list (eval (cons min (mapcar 'car ptlst))) (eval (cons max (mapcar 'cadr ptlst))))
			)
		)
		(cond
			((and
			  (= (length ptlst) 4)
			  (zerop (rem (- (angle (car ptlst) (cadr ptlst)) (angle (car ptlst) (cadddr ptlst))) (/ pi 2)))
			  (zerop (rem (- (angle (cadr ptlst) (car ptlst)) (angle (cadr ptlst) (caddr ptlst))) (/ pi 2)))
			  (zerop (rem (- (angle (caddr ptlst) (cadr ptlst)) (angle (caddr ptlst) (cadddr ptlst))) (/ pi 2)))
			  (zerop (rem (- (angle (cadddr ptlst) (car ptlst)) (angle (cadddr ptlst) (caddr ptlst))) (/ pi 2)))
			 )
				(setq
					l (distance (car ptlst) (cadr ptlst))
					h (distance (cadr ptlst) (caddr ptlst))
					l1 (max l h) h1 (min l h)
				)
				(initget 7)
				(while (< h1 (setq h2 (getdist "\nHauteur du rectangle à incrire: ")))
					(princ "\nHauteur plus grande à celle du rectangle sélectionné.")
					(initget 7)
				)
				(setq old_osm (getvar "osmode"))
				(setvar "osmode" 0)
				(setq da (sqrt (/ (* h2 h2) 2)) db (sqrt (- (* h2 h2) (* da da))) n 0.1 alpha 0.0)
				(while alpha
					(setq
						p1 (polar (car ptlst) (angle (car ptlst) (cadr ptlst)) da)
						p3 (polar (caddr ptlst) (angle (caddr ptlst) (cadddr ptlst)) da)
						p2 (polar (caddr ptlst) (angle (caddr ptlst) (cadr ptlst)) db)
						p4 (polar (car ptlst) (angle (car ptlst) (cadddr ptlst)) db)
					)
					(setq alpha (rem (- (angle p1 p4) (angle p1 p2)) (/ pi 2)))
					(if (equal alpha 0.0 n) (setq flag T) (setq flag nil))
					(cond
						((and (< alpha 0.0) flag)
							(setq n (- (/ n 10.0)))
						)
						((and (> alpha 0.0) flag)
							(setq n (+ (/ n 10.0)))
						)
					)
					(if (equal alpha 0.0 1E-12)
						(progn
							(command "_.pline" p1 p2 p3 p4 "_close")
							(setq alpha nil)
						)
					)
					(setq da (- da n) db (sqrt (- (* h2 h2) (* da da))))
				)
				(setvar "osmode" old_osm)
			)
			(T
				(princ "\nN'est pas un rectangle parfait!")
			)
		)
		(command "_.ucs" "_previous")
		(setvar "UCSICON" old_icusc)
	)
	(T
		(princ "\nEntité non valide!")
	)
)
(setvar "cmdecho" 1)
(princ)
)

Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius

  • 4 semaines après...

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é