Just nu i M3-nätverket
Gå till innehåll

Förstoring av area


fredand

Rekommendera Poster

Tjenis!

 

Jag frågde tidigare om förstoring av area i ett koordinatsystem och har nu gjort lite framsteg.

 

Jag tror jag har lyckats hacka ihop något som är på god väg. Jag bifogar 5 bilder för 5 olika scenarion.

 

Tyvärr blir det inte riktigt som jag tänkt mig så jag tänkte fråga er om någon enkelt ser vad felet kan vara.

 

Så här gör jag:

 

1) Jag börjar med att skapa en enkel kvadrat uppbyggd av 4 kordinater. (Denna kvadrat finns nu i 5 olika scenarion på bilderna som visar olika utgångsplatser i kordinatsystemet)

 

2) Då jag ska förstora tar jag reda på xMin1 xMax1 yMin1 yMax1 genom att kodmässigt söka igenom alla koordinater.

 

3) Sen är tanken att varje förstoring ska ske med ökningen 2 pixlar = 2 snäpp i kordinatsystemet. Då påstar jag att oberoende vart i kordinatsystemet så ska xMin2 xMax2 yMin2 yMax2 fås fram så här:

xMin2 = xMin1-2;

xMax2 = xMax1+2;

yMin2 = yMin1-2;

yMax2 = yMax1+2;

 

4) Sedan räknar jag ut de olika längderna för att enkelt kunna räkna ut nuvarande area samt den förstorade arean:

xLength1 = xMax1 - xMin1;

yLength1 = yMax1 - yMin1;

xLength2 = xMax2 - xMin2;

yLength2 = yMax2 - yMin2;

 

5) Areorna får jag fram så här:

area1 = xLength1 * yLength1;

area2 = xLength2 * yLength2;

 

 

6) Nu borde jag kunna räkna ut faktorn för förstoring:

araeFactor = area2/area1;

 

7) Sedan får jag fram de olika faktorerna som ska multipliceras med x-värdena och y-värdena så här:

increasingFactorMax = Math.sqrt(araeFactor); //Roten ur

increasingFactorMin = 2 - increasingFactorMax;

 

increasingFactorMax blir ju aldrig så stort eftersom jag max ökar med en pixel så jag borde få fram det andra talet genom att 2 - increasingFactorMax.

 

8) Jag får fram mittvärdet för nuvarande x och y koordinater så här:

middleX = xMin1 + (xLength1/2.0);

middleY = yMin1 + (yLength1/2.0);

 

9) Sedan multiplicerar jag alla kordinaters x-värden som är < mitten-middleX med increasingFactorMin samt alla kordinaters x-värden som är > mitten-middleX med increasingFactorMax för att få fram de nya värdena.

Jag gör på motsvarande sätt med alla kordinaters y-värden.

 

http://www.dsv.su.se/~fr-ander/1.JPG

http://www.dsv.su.se/~fr-ander/2.JPG

http://www.dsv.su.se/~fr-ander/3.JPG

http://www.dsv.su.se/~fr-ander/4.JPG

http://www.dsv.su.se/~fr-ander/5.JPG

 

Som du ser på bilderna så blir det inte riktigt så som jag tänkt mig. Jag vill att arean ska expandera propertineligt åt alla håll. (Även oavsett typ av area)

I vänster hörn ser du kvadratens ursprungsläge sen utförs denna beräkning vilkas värden du finner på bilden. Till höger ser du resultatet.

 

 

Mvh

Fredrik

 

 

 

 

 

 

 

Länk till kommentar
Dela på andra webbplatser

Du har ju lösningen i steg 3!

Använd max2 och min2 för den nya kvadraten!

 

/Pär B

 

Länk till kommentar
Dela på andra webbplatser

Hej!

 

Tack för ditt svar!

 

Fast det gäller väl inte om formen är en barbapappa?

 

Man vet väl inte åt vilket håll varje kordinat ska liksom?

 

Rätta mig om jag har fel.

 

Mvh

Fredrik

 

Länk till kommentar
Dela på andra webbplatser

Uppdatering!

 

Jag tror jag är lite närmare lösningen ändå nu:

 

Jag multiplicerade alla koordinater med increaseFaxtorMax och fick detta resultat som du kan se på den bifogade bilden. Som du ser är det nästan bra, men inte riktigt. Mittenkvadraten är ju bra men inte de andra Vad tror du är fel?

 

Mvh

 

Fredrik

 

 

Länk till kommentar
Dela på andra webbplatser

Uppdatering!

 

Jag tror jag är lite närmare lösningen ändå nu:

 

Jag multiplicerade alla koordinater med increaseFaxtorMax och fick detta resultat som du kan se på den länkade bilden. Som du ser är det nästan bra, men inte riktigt. Mittenkvadraten är ju bra men inte de andra. Vad tror du är fel?

 

http://www.dsv.su.se/~fr-ander/uppdatering.JPG

 

Mvh

 

Fredrik

 

 

Länk till kommentar
Dela på andra webbplatser

Hej,

 

Ditt specialfall med prydliga kvadrater är inte så krångligt.

 

NyArea = k * Area

 

Alla sidor ska förlängas med samma proportioner.

 

NySida = sqrt(k) * Sida

 

Ändringen i sidlängd blir då:

 

NySida - Sida = sqrt(k) * Sida - Sida = Sida(sqrt(k)-1)

 

Förlängningen ska vara lika stor i bägge ändar av en sida:

 

Ändring = Sida*(sqrt(k)-1)/2

 

Nu kan vi täcka in alla rektanglar, så länge dom är parallella med koordinatsystemet.

 

Rektangel=(Xmin,Xmax,Ymin,Ymax)

 

XÄndring = (Xmax-Xmin)*(sqrt(k)-1)/2

YÄndring = (Ymax-Ymin)*(sqrt(k)-1)/2

 

NyXmin = Xmin - XÄndring

NyXmax = Xmax + XÄndring

NyYmin = Ymin - YÄndring

NyYmax = Ymax + YÄndring

 

Skulle vi vrida rektanglarna, eller lägga till fler sidor, blir det betydligt krångligare ...

 

mvh

/Johan

 

Länk till kommentar
Dela på andra webbplatser

OK! Jag trodde att det enbart rörde sig om kvadrater...

För att lösa problemet mer generellt måste vi blanda in trigonometri. Nedan följer en ytterst kortfattad förklaring hur du gör.

 

Bestäm en mittpunkt för din figur.

 

Varje punkt vars koordinater du vill förändra kan nu beskrivas som:

(cos(a)*l+cx,sin(a)*l+cy)

Där a = vinkel mot basplanet (0-360), l = avstånd till centrumpunkt och (cx,cy) = centrumpunktens koordinater.

 

En förstoring på 50% appliceras då som:

(cos(a)*l*1,5+cx,sin(a)*l*1,5+cy)

 

/Pär B

 

 

Länk till kommentar
Dela på andra webbplatser

Hej Pär!

 

jag har försökt och kämpat med din formel, men jag är osäker på om jag förstår den.

 

Kan jag välja mittpunkt helt själv?

 

Hur får jag fram vinkeln mot basplanet och är basplanet lägsta koordinaten?

 

tacksam för svar!

 

Mvh

Fredrik

 

Länk till kommentar
Dela på andra webbplatser

Hej!

 

Mittpunkten i en fyrkant är där diagonalerna skär varandra, i andra figurer får du välja själv. Tänk dock på att om punkten hamnar snett kan en förstoring bli lite oproportionerlig.

 

Basplanet är den positiva x-axeln.

 

En kvadrat 1,1 - 1,3 - 3,3 - 3,1 - (1,1) har mittpunkten 2,2. Från mittpunkten till varje hörn är det roten ur 2 i längd (pytagoras sats)

 

Första koordinatparet är: (cos(45)*roten ur 2 + 2, sin(45)*roten ur 2 +2)

För andra är vinkeln 135, tredje 225 och fjärde 315.

 

/Pär B

 

Länk till kommentar
Dela på andra webbplatser

Arkiverat

Det här ämnet är nu arkiverat och är stängt för ytterligare svar.

×
×
  • Skapa nytt...