[Inf 1] Probleem bij het zoomen

Forum van 1ste Bachelor Fysica.

Moderator: Praesidium

User avatar
ben
Prosenior
Posts: 1356

[Inf 1] Probleem bij het zoomen

Post#1 » Tue May 13, 2008 4:08 pm

Als eindwerk moeten wij een mandelbrot fractal kunnen tekenen in java (http://nl.wikipedia.org/wiki/Mandelbrot) en daar dan op kunnen zoomen door ergens te klikken. Na lang zwoegen is het tekenen gelukt en kan ik ook zoomen, maar slechts een keer! Ik heb een klasse gemaakt die een mouselistener implementeert en dan met de method :

Code: Select all

public void mouseClicked(MouseEvent e){


double z = 10;



double xi = b.getxMin() +b.getdx()*(double)e.getX();//eventclick transformeren naar imaginaire coo

double yi = b.getyMin() +b.getdy()*(double)e.getY();


b.setBroodje(xi - (b.getxMax()-b.getxMin())/z,
xi + (b.getxMax()-b.getxMin())/z,
yi - (b.getyMax()-b.getyMin())/z,
yi + (b.getyMax()-b.getyMin())/z);




Broodje is een klasse waarin een bufferedImage wordt geschreven die de mandelbrot mooi inkleurt. Deze hangt af van een minimum punt linksboven en tekent tot een maximumpunt rechtsonder. Als je ergens klikt worden deze punten bepaald ten opzichte van je klik en wordt de fractaal getekend. Het probleem is echter dat hij wel wil tekenen, maar dat bij de volgende klik er niets is aangepast aan mijn object Broodje b. Wanneer ik dus voor de tweede keer klik, is dit alsof ik klik op de image die is gerenderd wanneer ik mijn programma start en dus zoomt hij niet verder in.

Weet iemand wat ik mis doe en hoe ik dat zou kunnen oplossen?

Alvast bedankt!

Ben

edit(Robbe): heb even een nieuwe topic gemaakt, om de dingen wat logischer te houden ;)

User avatar
Lesly
Posts: 343

Post#2 » Tue May 13, 2008 4:35 pm

als z de zoomfactor is dan:

toevoegen in uw klasse:

Code: Select all

private:
double z = 1;
en vervang dan:

Code: Select all

double z = 10;
met

Code: Select all

z *= 10;
dat zou moete werken voor zover ik aan uw code uit kan

(nu blijft uwe zoom constant op 10 staan)

Pieter Belmans
Posts: 593
Contact:

Post#3 » Tue May 13, 2008 4:38 pm

Met zo'n naamgeving krijgt ge bij software engineering een stamp onder uw gat waardoor ge negen jaar lang ni op de campus durft verschijnen :P.

User avatar
Robbe
WOZ
Posts: 2161
Contact:

Post#4 » Tue May 13, 2008 5:34 pm

Pieter Belmans wrote:Met zo'n naamgeving krijgt ge bij software engineering een stamp onder uw gat waardoor ge negen jaar lang ni op de campus durft verschijnen :P.
rustig he Pieter, die mensen krijgen helemaal niet zo'n goede opleiding als wij ;) Probeer het op zijn misnt wat subtieler aan te pakken!

btw, heb ook even een nieuwe topic gemaakt om de dingen wat uit elkaar te houden ;)
"I'm not afraid of falling, I'm afraid of landing" -- Sam
How To Ask Questions The Smart Way

Zingen? UKA-n dat ook!

User avatar
NecRock
WOZ
Posts: 2481

Post#5 » Tue May 13, 2008 5:57 pm

Worden xMax enzo aangepast bij het zoomen?

User avatar
Tom
Posts: 602

Post#6 » Tue May 13, 2008 9:08 pm

NecRock wrote:Worden xMax enzo aangepast bij het zoomen?
Denk niet dat die aangepast hoeven te worden, die zijn om het grootte van het venster aan te duiden. (Het is wat moeilijk om het uit die code af te leiden) De fout ligt waarschijnlijk aan die Z zoals eerder vermeldt.

Let er ook op dat je maar een aantal keer kan inzoomen door de precisie van het type van uw eenheid, ook moet je zien dat je genoeg iteraties doet als je wilt dat het een beetje klopt. Dit gaat dan weer ten koste van je rekenkracht.

Als je dit interessant vindt en wil je tot het extreme gaan dan kan je met behulp van shader talen (GLSL/HLSL) hier meer precies en met meer prestaties te werk gaan. Heb eens in C++ en OpenGL hiermee gerommeld begin dit academiejaar.


Hier kan je iets soortgelijk vinden:
http://www.ozone3d.net/demos_projects/m ... ot_set.php


Succes en veel plezier...
http://www.google.be/search?q=mandelbro ... outube.com

User avatar
ben
Prosenior
Posts: 1356

Post#7 » Tue May 13, 2008 10:26 pm

Bedankt voor de antwoorden! (Probleem opgelost, zie volgende post, deze laat ik dan maar staan voor de geïnteresseerden!)

@Lesly: Door de z buiten de method te definieren, kan ik inderdaad zoomen, maar gebeurt de coördinaten transformatie niet helemaal zoals het zou moeten. Ik besef nu hoe slecht ik het heb uitgelegd, dus hier komt een nieuwe poging:

MouseClicked is een method van een klasse die de mouseListener implementeert. Bovenaan deze klasse gebeurt dit:

Code: Select all

private JCanvas c = new JCanvas();
private JFrame f = new JFrame("Mandelbrot");
Broodje b = c.getBroodje();
Waar JCanvas de PaintComponent override van de JComponent en hierop een kleurfunctie aangestuurd door de klasse Broodje plaatst. (dit omdat Broodje een BufferedImage beschrijft). JFrame spreekt voor zich denk ik.

Broodje heeft een method

Code: Select all

setBroodje(xMin, xMax, yMin ,yMax)
. Deze method tekent op een BufferedImage een mandelbrot met als deze waarden als maximale/minimale y/x waarden in het complexe vlak. De pixels worden dus via een coördinaten transformatie naar overeenkomstige punten in het complexe vlak getranformeerd. Het idee is om bij het punt waar je klikt een deel

Code: Select all

(xMax-xMin)/z
bij en af de x-waarde te tellen en deze als resp xMax en xMin met setBroodje mee te geven (vandaar dat z een constante waarde was) Bij y analoog en zo krijg je normaal gezien een mandelbrot die loopt van je nieuwe punt (xMin, yMin) tot (xMax,yMax), aangezien deze schaal nu kleiner is, is er gezoomd rond het geklikte punt.(=@Necrock)

Mijn probleem is nu dat wanneer ik via setBroodje mijn xMax ,... in het Broodje b aanpas, deze de klik erna weer de originele waarden aannemen in plaats van de bij de vorige klik ingevoerde xMax,.... Ik kreeg echter wanneer ik hetzelfde deed als wat lesly voorstelt, maar dan met een integer die bij iedere klik moest optellen, geen optellende integer, maar steeds de beginwaarde die vooraf was gedefinieerd. Nu wil dit wel werken dus ga ik eens proberen mijn xMax,... zo bij te houden.

@Pieter, sorry he ik ben een fysicus :P

@Robbe, bedankt om mij te verdedigen :-D en ook voor het verplaatsen van de topic.

@Tom, ik denk dat ik het voor nu nog even bij java ga houden, de prof moet ook nog meekunnen he :P. Ik moet hier thuis alleen een beetje opletten met het aantal iteraties ik mijn zes jaar oud dingetje met een 1,6GHz athlon, laat doen, hij heeft het nu al zo warm!

Dan tot slot een triviavraagje, de link naar die mandelbrot set van Tom (http://www.ozone3d.net/demos_projects/m ... ot_set.php)
Deze staat op een site die vooral uitpakt met coole en supersnelle gpu's. Nu dacht ik eigenlijk dat de meeste van die berekeningen (en dan zeker in java) door de cpu gebeuren of zit ik hier fout?

Soit, geniet nog van het weer!

Ben
Last edited by ben on Tue May 13, 2008 10:55 pm, edited 1 time in total.

User avatar
ben
Prosenior
Posts: 1356

Post#8 » Tue May 13, 2008 10:54 pm

Goed, een kwartier later wilde het wel werken. Voor de geïnteresseerden:

public void mouseClicked(MouseEvent e){


Code: Select all

dx = (xMax-xMin)/b.getImage().getWidth(); //bedrag dat er per pixel bijkomt
dy = (yMax-yMin)/b.getImage().getHeight();

double xi = xMin + dx*(double)e.getX();//eventclick transformeren naar imaginaire coo
double yi = yMin + dy*(double)e.getY();

double xMinO = xMin; //tijdelijke storage van xMin en yMin
double yMinO = yMin;
xMin = xi - (xMax - xMinO)/z; //bij de klik een bedrag bijtellen/aftrekken voor het nieuwe kadertje te krijgen
xMax = xi + (xMax - xMinO)/z;
yMin = yi - (yMax - yMinO)/z;
yMax = yi + (yMax - yMinO)/z;

b.setBroodje(xMin, xMax, yMin, yMax); //Broodje tekenen

c.draw();
Ik heb dus gewoon ervoor gezorgd dat b enkel werd gebruikt om te tekenen. De variabelen xMax,... worden nu binnen deze klasse bijgehouden.
Weet er iemand waarom deze waarden niet worden aangepast in het object b? Er staat niets op private ofzo( moest dat er iets mee te maken hebben).

Soit jullie zijn bedankt!

Tot de volgende!

Ben

User avatar
Tom
Posts: 602

Post#9 » Tue May 13, 2008 10:57 pm

Nu dacht ik eigenlijk dat de meeste van die berekeningen (en dan zeker in java) door de cpu gebeuren of zit ik hier fout
Dit gebeurd steeds zo tenzij je het in een shader programmeert.

http://en.wikipedia.org/wiki/Shader
http://en.wikipedia.org/wiki/Pixel_shader
http://nl.wikipedia.org/wiki/Pixel_shader

Maarja, het ging om de interesse, je zal (in het andere geval) wel blij zijn dat je er vanaf bent veronderstel ik.
Weet er iemand waarom deze waarden niet worden aangepast in het object b? Er staat niets op private ofzo( moest dat er iets mee te maken hebben).
Zie nergens dat je setters aanroept (Misschien dat je dit boven het hoofd ziet), verwacht dat ze dan in ZetBroodje staan. Misschien dat er daar iets mis is. (Ook lokaal gedefinieerd ofzo)

User avatar
NecRock
WOZ
Posts: 2481

Post#10 » Tue May 13, 2008 11:26 pm

ben wrote:Ik heb dus gewoon ervoor gezorgd dat b enkel werd gebruikt om te tekenen. De variabelen xMax,... worden nu binnen deze klasse bijgehouden.
Weet er iemand waarom deze waarden niet worden aangepast in het object b? Er staat niets op private ofzo( moest dat er iets mee te maken hebben).
Moeilijk over te oordelen zonder code van setBroodje en misschien de variabelen van de klasse ^^


En by the way...
[betweter]
ben wrote:Mijn probleem is nu dat wanneer ik via setBroodje mijn xMax ,... in het Broodje b aanpas, deze de klik erna weer de originele waarden aannemen in plaats van de bij de vorige klik ingevoerde xMax,.... ^
Eigelijk dacht ik da het zoiets kon zijn, vandaar da ik vroeg of die xMax enzo wel aangepast werden :p [/betweter]

User avatar
ben
Prosenior
Posts: 1356

Post#11 » Tue May 13, 2008 11:43 pm

Tom wrote:
Zie nergens dat je setters aanroept (Misschien dat je dit boven het hoofd ziet), verwacht dat ze dan in ZetBroodje staan. Misschien dat er daar iets mis is. (Ook lokaal gedefinieerd ofzo)
Uhu, ik bereken wel een bufferedImage met setBroodje, maar die method veranderd niets aan de oorspronkelijke xMax,... waarden van b.

Soit ik ben idd heel blij dat het gedaan is!

Nog eens bedankt en slaapwel!

Ben

Return to “1ste Bachelor”

Who is online

Users browsing this forum: Bing [Bot] and 1 guest

cron