Aller au contenu

Déformation de polyligne


G2.toff

Messages recommandés

Bonjour,

 

J'ai un ami qui recherche une solution pour "déformer" une polyligne sur autocad, j'ai pensais a un lisp par exemple.

 

Je joins une image vite fait d'un résultat souhaité (si j'ai tout compris a son explication). Il part d'une polyligne lisse (ou contour) et redessine manuellement une polyligne complétement aléatoirement afin de matérialiser par exemple une limite végétale ou un contour de zone végétalisée. aujourd'hui il fait apparaitre sa limite brute (courbe ou droite) et redessines plus ou moins par dessus une polyligne ou un contour en réalisant une multitude de clic pour pointer de nouveaux sommets.....sacrément pénible je pense.

 

Pensez vous qu'il soit possible de créer un lisp qui intégrerait une amplitude de déformation (hauteur des pointes) et une discrétisation (longueur de segmentation), le tout aléatoirement afin d'obtenir une polyligne ou contour complétement déformés comme sur l'exemple (en blanc).

 

Cordialement.

Toff.

post-59270-0-58995700-1457516807_thumb.jpg

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

Un truc à ma disposition (qui n'est pas de moi), qui se rapproche de ton souhait.

Ca peut être une base de départ...

 

; GRASS.LSP 
; Realistic Grass for Elevations
; (c)1994,  Watson Kilbourne
; Draws row of grass with random height, 
; spacing and angle in elevation
; Random number generator, from 0.000 to 0.999
(defun rn ( / md mx nc) 
  (if (not sd) (setq sd (getvar "DATE")))
  (setq md 65536
        mx 25173
        nc 13849
        sd (rem (+ (* mx sd) nc) md)
  )
  (/ sd md)
)
(defun c:GRASS ( / sp ep gh dn dx an p1 p2 p3 p4 p5 sd)
  (initget 9)
  (setq sp (trans (getpoint "\nPoint de départ de l'herbe: ") 1 0))
  (initget 41)
  (setq ep (trans (getpoint (trans sp 0 1) "\nPoint final de l'herbe: ") 1 0))
  (initget 6)
  (setq gh (getdist "\nHauteur approximative de l'herbe <2.5>: "))
  (if (not gh) (setq gh 2.5))
  (initget 6)
  (setq dn (getint "\nFacteur de densité de 1à 6 <3>: "))
  (if (or (not dn) (> dn 6)) (setq dn 3))
  (setq dx (distance sp ep)
        an (angle sp ep)
        p1 sp p2 sp
  )
  (while (< (distance p2 sp) dx)
     (setq p2 (polar p1 an (/ (+ (rn) (/ gh 2)) dn))
           p3 (polar p2 (* pi 0.5) (* gh (rn)))
           p4 (polar p3 (* pi 0.6) (* gh (rn)))
           p5 (polar p4 (* pi 0.4) (* gh (rn)))
     )
     (entmake (append '((0 . "LINE")) (list (cons 8 (getvar "clayer"))) (list (cons 10 p3) (cons 11 p5))))
     (setq p1 p2)
  )
  (princ)
)

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

Lien vers le commentaire
Partager sur d’autres sites

L'image ne déforme pas une polyligne mais une ligne.

Donc y a -t-il un électrocardiogramme par segment ou tout du long ?

Déjà la question que je me pose....

je ne suis pas sur qu'il y a une fonction "random" en autolisp...

je serai curieux de savoir tien...

A ma connaissance, seulement par le tampon du temps :P

Par une fonction de date à l'instant t. C'est le seul moyen.

Bureau d'études dessin.

Spécialiste Escaliers

Développement - Formation

 

./__\.
(.°=°.)
Lien vers le commentaire
Partager sur d’autres sites

Salut à tous,

 

Il y a quelques années, un aimable membre de CadXP m'avait écrit ce petit truc :

(defun c:tirage	(/ modulus multiplier increment random)
 (princ "\nTirage :")
 (if (not seed)
   (setq seed (getvar "DATE"))
 ) ;_ Fin:if
 (setq	nombre (setq modulus	65536
	     multiplier	25173
	     increment	13849
	     seed	(rem (+ (* multiplier seed) increment) modulus)
	     random	(/ seed modulus)
       ) ;_ Fin:setq
 ) ;_ Fin:setq
 (setq numero_sorti (fix (* 250 nombre)))
)

Mais comme le dit Tramber, c'est issu de la date.

Windows 11 / AutoCAD 2024

Sur terre, il y a 10 types de personnes, celles qui comptent en binaire et les autres (developpez.net).
Davantage d'avantages, avantagent davantage (Bobby Lapointe).
La connaissance s'accroît quand on la partage (Socrate).
Tant va la cruche à l'eau que l'habit n'amasse pas mousse avant de l'avoir tué. (Moi)

Lien vers le commentaire
Partager sur d’autres sites

Ce qui donnerait en faisant une modification rapide (sans ENTMAKE) pour faire une polyligne.

 

(defun rn ( / md mx nc) 
  (if (not sd) (setq sd (getvar "DATE")))
  (setq md 65536
        mx 25173
        nc 13849
        sd (rem (+ (* mx sd) nc) md)
  )
  (/ sd md)
)
(defun c:GRASS ( / sp ep gh dn dx an p1 p2 p3 p4 p5 sd)
  (initget 9)
  (setq sp (trans (getpoint "\nPoint de départ de l'herbe: ") 1 0))
  (initget 41)
  (setq ep (trans (getpoint (trans sp 0 1) "\nPoint final de l'herbe: ") 1 0))
  (initget 6)
  (setq gh (getdist "\nHauteur approximative de l'herbe <2.5>: "))
  (if (not gh) (setq gh 2.5))
  (initget 6)
  (setq dn (getint "\nFacteur de densité de 1à 6 <3>: "))
  (if (or (not dn) (> dn 6)) (setq dn 3))
  (setq dx (distance sp ep)
        an (angle sp ep)
        p1 sp p2 sp
  )
  (setvar "CMDECHO" 0)
  (command "_.pline" "_none" (trans sp 0 1))
  (while (< (distance p2 sp) dx)
     (setq p2 (polar p1 an (/ (+ (rn) (/ gh 2)) dn))
           p3 (polar p2 (* pi 0.5) (* gh (rn)))
           p4 (polar p3 (* pi 0.6) (* gh (rn)))
           p5 (polar p4 (* pi 0.4) (* gh (rn)))
     )
     ;(entmake (append '((0 . "LINE")) (list (cons 8 (getvar "clayer"))) (list (cons 10 p3) (cons 11 p5))))
     (command "_none" (trans p3 0 1))
     (setq p1 p2)
  )
  (command "_none" (trans ep 0 1) "")
  (setvar "CMDECHO" 1)
  (princ)
)

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

Lien vers le commentaire
Partager sur d’autres sites

Merci pour vos réponses hyper rapides....et hyper efficaces !

 

Olivier, je lui ai proposé ta solution, mais il rencontre 2 problèmes, le 1er c'est qu'il est comme moi "mainlev" connait pas (ou plutôt il veut plus connaitre) et le 2ème c'est qu'il tient pas l'alcool ! (rires forts)

 

Pour répondre à certains, en fait il redessine une polyligne avec plein de sommets en essayant de ne pas dépasser sa polyligne lisse qui ne lui sert de repère et visiblement il matérialise des zones, donc des contours. Ce sont des zones des massifs végétaux qu'il dessine de cette manière afin de les distinguer des autres zones du dessin qui sont représentées avec des polyligne lisses.

 

Bonuscad, je viens de lui transmettre et d'essayer ta solution (le dernier lisp) qui correspond à ce qu'il m'a décrit. Il a sauté au plafond, car il ne pensait pas que ce soit possible et surtout avoir si vite une réponse si proche de ce qu'il suhaite.

 

Sauf qu'il veut savoir si on peut éviter "d'arrèter" la fonction dés le second point et donc faire une polyligne, si on peut réaliser des courbes dans la polyligne ou si trop complexe Est-ce que l'on peut juste sélectionner une polyligne lisse(composée de droite et de courbes etc...) et la transformer en polyligne "tordue" avec ces 2 contraintes.

 

Voilà, déjà merci....

 

Cordialement.

Toff

Lien vers le commentaire
Partager sur d’autres sites

Sauf que la fonction MAINLEV existe réellement (regarde dans les Express Tool) Elle évite de devoir cliquer façon mitraillette.

Olivier

 

 

Bonjour,

 

En effet, en plus je connaissais pas, finalement ma blague ratée m'aura été utile ! Je passais par des trucs de fou d'un tuto pour créer des polylignes perso....je vaus regarder cette fonction du coup !

 

Finalement merci bien Olivier....comme quoi on en apprend toujours...

 

Cordialement

Toff

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

 

c'état de l'humour pour les whisky, mais comme indiqué par -Olivier- , la fonction MAINLEV est bien une fonction AutoCAD (à taper au clavier) avec la possibilité de dessiner des lignes ou polyligne et de fixer le pas de création des sommets. Ensuite la polyligne est dessinée au fur et à mesure que l'on bouge la souris.

 

Les 3 verres de whisky, c'était juste pour trembler un peu, mais ça marche aussi avec un bon hoquet ou une boule de souris un peu encrassée.laugh.gif

 

Nos réponses se sont croisées.

 

Olivier

Lien vers le commentaire
Partager sur d’autres sites

Si MAINLEV te convient bien, je ne cherche pas à améliorer la fonction GRASS.

 

Le désaventage de mainlev est que l'incrémentation est relativement régulière à moins d'avoir des accélération subite du curseur, ce qui n'est pas trop évident au niveau de la maitrise des directions...

 

Par contre grass ne marche pas bien pour des directions proche de la verticale (à l'origine c'est pour simuler de l'herbe sur un plan proche de l'horizontale), il faudrait revoir le code en profondeur.

 

Je pense que Mainlev ne va pas si mal, mais ça demande une certaine dextérité sur la mainiement de la souris pour avoir un effet aléatoire... ou alors avoir un dessinateur atteint de la maladie de Parkinson.

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

Lien vers le commentaire
Partager sur d’autres sites

Si MAINLEV te convient bien, je ne cherche pas à améliorer la fonction GRASS.

 

Le désaventage de mainlev est que l'incrémentation est relativement régulière à moins d'avoir des accélération subite du curseur, ce qui n'est pas trop évident au niveau de la maitrise des directions...

 

Par contre grass ne marche pas bien pour des directions proche de la verticale (à l'origine c'est pour simuler de l'herbe sur un plan proche de l'horizontale), il faudrait revoir le code en profondeur.

 

Je pense que Mainlev ne va pas si mal, mais ça demande une certaine dextérité sur la mainiement de la souris pour avoir un effet aléatoire... ou alors avoir un dessinateur atteint de la maladie de Parkinson.

 

En effet, il a opté pour la fonction MAINLEV qui lui va très bien....le lisp "grass" ne permettant pas les courbes il ne lui convient pas trop finalement. De plus il trouve que le coté "a main levée" lui permet de maitriser au mieux ce a quoi il veut arriver.

 

Merci encore à tous.

 

Cordialement

Toff

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é