[AS3] Scalen van objecten mbv muis

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Abductee
  • Registratie: Oktober 2007
  • Laatst online: 20-11-2024
Hoi allemaal,

ik ben bezig met een project waarin een aantal objecten op een veld gesleept kunnen worden, waarna het mogelijk moet zijn om deze objecten te scalen, roteren, ... met behulp van de muis. Hierbij wordt de linksboven hoek gebruikt als handle voor het roteren, en rechtsonder is de handle voor het schalen.
Het roteren werkt ondertussen zoals het hoort, maar het scalen is een andere zaak.

Mijn eerste poging was om het verschil tussen de vorige en de huidige muiscoördinaten te nemen en die bij de hoogte en breedte van mijn object op te tellen. Dit werkt goed, zolang het object niet geroteerd is natuurlijk.

Mijn tweede poging was om het verschil in afstand tot het middelpunt van het object te nemen, en dat dan bij de breedte en hoogte op te tellen, maar dit lijkt ook niet zo goed te werken

Flash ActionScript: ArtCanvas.as
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
private function handleObjectResize(event:MouseEvent):void {
    event.stopImmediatePropagation();
    var ratio:Number = currentObject.width / currentObject.height;
            
    var globalCentre:Point = currentObject.localToGlobal(new Point(currentObject.width/2, currentObject.height/2));
    var currentPoint:Point = new Point(event.stageX, event.stageY);
    var distanceStartX:Number = startPoint.x - globalCentre.x;
    var distanceStartY:Number = startPoint.y - globalCentre.y;
    var distanceCurrentX:Number = currentPoint.x - globalCentre.x;
    var distanceCurrentY:Number = currentPoint.y - globalCentre.y;
            
    var distanceStart:Number = Math.sqrt(Math.pow(distanceStartX, 2) + Math.pow(distanceStartY, 2));
    var d:Number = 1;
    if (distanceStart > distanceCurrent)
        d *= -1;
    var distanceCurrent:Number = Math.sqrt(Math.pow(distanceCurrentX, 2) + Math.pow(distanceCurrentY, 2));
            
    var distanceDifference:Number = distanceCurrent - distanceStart;
    currentObject.width += (distanceDifference * d);
    currentObject.height += (distanceDifference * ratio *d);
            
    startPoint = new Point(event.stageX, event.stageY);
}


Het probleem hiermee is dat de mate van vergroting in de eerste plaats niet klopt (lijkt het dubbel te zijn van wat zou moeten), en wanneer het object erg klein gemaakt wordt, beginnen de afmetingen heel rare waarden aan te nemen.

Nu heb ik uiteraard al gegoogled tot ik er bij wijze van spreken bij neerviel, maar veel nuttings heb ik niet gevonden. Dat kan natuurlijk ook wel aan mijn google-skills liggen :+

Hopelijk kan hier iemand me wat verder op weg helpen, want op deze manier is het voorlopig wel werkbaar, maar zo mag het natuurlijk niet blijven...

Alvast bedankt aan iedereen die de moeite doet om hier samen met mij zijn hoofd over te breken (of om mij op een ontzettend stomme fout te wijzen?)

Acties:
  • 0 Henk 'm!

Verwijderd

Flash ActionScript 3:
1
currentObject.width = event.stageX - currentObject.X

Dit kan je ook met de height doen.
Wel oppassen met negatieve waarden, hiervoor moet je nog even een paar checks inbouwen =)

[edit] hmm, hiermee wordt de schaal niet behouden.
Ik kom hier zo nog even op terug.

Met ratio behouden:
Flash ActionScript 3:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
private function onResize(event:MouseEvent):void {
                var old_width:Number = currentObject.width
                var old_height:Number = currentObject.height
                
                var new_width:Number = event.stageX+currentObject.x - currentObject.x
                var new_height:Number = event.stageY+currentObject.y - currentObject.y
                
                if (new_width > old_width || new_height > old_height) {
                    //vergroten
                    var width_ratio:Number = new_width / old_width;
                    var height_ratio:Number = new_height / old_height;
                    
                    //welke ratio is leidend? hoogte of breedte?
                    if (width_ratio > height_ratio) {
                        //apply width ration to both
                        currentObject.width *= width_ratio;
                        currentObject.height *= width_ratio;
                        
                    } else {
                        //apply height ration to both
                        currentObject.width *= height_ratio;
                        currentObject.height *= height_ratio;
                    }
                } else {
                    //verkleinen
                }
            }

[ Voor 89% gewijzigd door Verwijderd op 28-08-2009 15:44 ]


Acties:
  • 0 Henk 'm!

  • Abductee
  • Registratie: Oktober 2007
  • Laatst online: 20-11-2024
Flash ActionScript:
1
2
var new_width:Number = event.stageX+currentObject.x - currentObject.x
var new_height:Number = event.stageY+currentObject.y - currentObject.y


Die twee regels lijken me niet bepaald te kloppen, maar ik ga het voor de rest even uitproberen :)

edit: op deze manier is het scalen weer compleet onvoorspelbaar geworden...

[ Voor 12% gewijzigd door Abductee op 28-08-2009 16:07 ]