![]() |
|
|
![]() |
|||||||||||||
![]() |
||||||||||||||||
|
![]() |
#11 |
Registriert seit: 29.03.2004
Beiträge: 2.537
|
|
![]() |
![]() |
Sponsored Links | |
|
![]() |
#12 |
Themenersteller
Registriert seit: 06.05.2005
Ort: Linz
Beiträge: 10
|
soft selection
hallo!
daselbe projekt, eine andere frage: ich müßte so eine art soft selection realisieren. dabei hab ich aber das problem, dass ich zwar schon ein paar sachen ausprobiert habe, ich aber irgendwie nicht weiß durch welchen 'soft-selection-algorithmus' ich verhindern kann, dass sich die polygone quasi ins 'ungültige' verschieben lassen. ein beispiel: ich verschiebe einen vertex V entlang der positiven y-achse. nach jedem schritt berechne ich für jeden nachbarn (Top, Right, Bottom und Left) die position (entweder den mittelwert aus dessen nachbarpunkten oder über den durchschnitt der verschiebungsvektoren der nachbarn,...). aber wenn ich den vertex V immer weiter nach 'oben' verschiebe passiert es irgendwann, dass er sich oberhalb seines oberen nachbarn T befindet. und genau das soll nicht passieren. irgendwie fehlen mir aber die ideen wie ich die position der nachbarn T, R, B und L berechnen kann, um dies zu verhindern. wenn ich mir die soft selection bei z.b. 3ds max oder maya ansehe, können sie diesem problem ja auch entgehen. leider weiß ich nicht welche berechnungsmethode man dort anwendet. also wenn jemand eine idee hat, wie ich das anstellen kann, bitte sagt mir bescheid. tausend dank, Judy |
![]() |
![]() |
![]() |
#13 |
Registriert seit: 29.03.2004
Beiträge: 2.537
|
Wieso speicherst Du denn nicht einfach alle Koordinaten in einem array oder in einer Liste,
und vergleichst dies beim Verschieben mit den Koordinaten des aktuellen punktes? Soo viele können es doch gar nicht sein... Ich hab mir für ein GUI eine Mauserfassung geschrieben, bei der ich einen Rahmen verschieben oder verändern kann. Da muss ich die Position der anderen Objekte mit berücksichtigen, auch ob der Rahmen am Bildrand anstoßen soll oder darüber hinausgeschoben werden darf. Wenn Du erstmalig einen Gitterpunkt auswählst, müßtest Du doch auch die benachbarten Punkte kennen und dementsprechend ein maximales Feld rund um den einen Punkt berechnen können. Code:
a --- b --- c | \ | / | d --- p ---e | / | \ | f --- g --- h pseudocode: wenn (p.x > c.x) dann p.x = c.x (weiter rechts geht nicht) wenn (p.y < a.y) dann p.y = a.y (höher darf nicht) wenn (p.x < d.x) dann p.x = d.x (halt links) wenn (p.y > g.y) dann p.y = g.y (unten anhalten) sondern beliebige Polygone) "intelligenter" machen, also abhängig von den Koordinaten von (p) relativ zu den Verbindungsgeraden, z.b. unten links f <-> g, mit linearen Gleichungen prüfen, ob sich (p) immer noch innen oder schon am Rand befindet. |
![]() |
![]() |
![]()
|
|
|