#1 18.05.2006 07:02:23

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Mathe: Kugel in 2D pixeln (Mitte hell, dunkler nach aussen)

Hallo,

ich baue gerade einen Height Map Generator, der soll ein Graustufen Image erzeugen für eine Heightmap.

ich habe eine for for Schleife:

for i:=0 to hillwidth
for j:=0 to hillheight
canvas.pixels[i+lefthill,j+tophill]:=rgb(z,z,z)

Wie berechne ich Z um eine Kugel zu bekommen, die in der Mitte am hellsten ist und nach aussen dunkler wird, wohlgemerkt eine Kugel soll das hinterher sein, die quasi wie eine beleuchtete 3D Kugel aussieht...

Oder falls jemand ein bessere Idee hat: Wie kriege ich da einen Zufallsgenerierten Hügel rein, der mal gekrümmt, langgezogen oder relativ rund ist?

Noch was anderes am Rande: Wenn ich ein Image auf die Form ziehe und mit canvas.pixels[i,j]:=rgb(z,z,z) wobei z:=random(255) ist, warum ist das nur schwarz oder weiß? Muss ich da beim Image auf der Form erst was initialisieren? Habe mich da lange nicht mehr mit beschäftigt...

Danke
Firle

Offline

 

#2 18.05.2006 07:16:39

JorEl
ExtremeMember
Registriert: 29.01.2005
Beiträge: 894

Re: Mathe: Kugel in 2D pixeln (Mitte hell, dunkler nach aussen)

Zitat:

Wie berechne ich Z um eine Kugel zu bekommen, die in der Mitte am hellsten ist und nach aussen dunkler wird, wohlgemerkt eine Kugel soll das hinterher sein, die quasi wie eine beleuchtete 3D Kugel aussieht...

Ist doch ganz einfach - du verwendest dazu den Radius. Du kennst den Mittelpunkt der Kugel (und diese Stelle soll soweit ich es verstehe am hellsten sein, d.h. r=0 bedeutet eine Helligkeit von 1.0). Der maximale Radius hingegen hat dann eine Helligkeit von 0.0.

Den Radius bekommst du trivialerweise über den Pythagoras, der Radius ist nämlich einfach gleichzusetzen mit der Hypothenuse eines rechtwinkeligen Dreiecks. Die Abweichung des aktuellen Pixels vom Mittelpunkt der Kugel kann man in x/y angeben und diese Werte entsprechen den Katheten a und b. Kurz gesagt: c^2 = a^2 + b^2, d.h. der Wert den du haben willst ist c=sqrt(a^2 + b^2).

Zitat:

Oder falls jemand ein bessere Idee hat: Wie kriege ich da einen Zufallsgenerierten Hügel rein, der mal gekrümmt, langgezogen oder relativ rund ist?

Ich würde ein kleines Fraktal generieren, dann dafür sorgen, dass es (wieder anhand des Radius vom Mittelpunkt) nach aussen hin weggeblendet wird und das Ergebnis dann überblenden. Google mal nach midpoint replacement, ist relativ einfach zu implementieren.

JorEl


Jesus hat gesagt - selig sind die, die da Leid erfahren, denn sie sollen getröstet werden... Ford Prefect hat gesagt - es ist unheimlich wichtig, dass wir miteinander reden und einen trinken.

Offline

 

#3 18.05.2006 07:22:05

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe: Kugel in 2D pixeln (Mitte hell, dunkler nach aussen)

Hi JorEl,

ja, da hätte ich sogar selber drauf kommen können, habe so lange keine Geometrie mehr gebraucht... big_smile

Danke für den Tip.

Das mit den Fraktalen hört sich gut an, mal gugn wie aufwendig sowas ist.

Hat noch jemand eine Idee warum das Image nur schwarz weiß ist?

Danke sehr!
Firle

Offline

 

#4 18.05.2006 07:30:08

JorEl
ExtremeMember
Registriert: 29.01.2005
Beiträge: 894

Re: Mathe: Kugel in 2D pixeln (Mitte hell, dunkler nach aussen)

Zitat:

Noch was anderes am Rande: Wenn ich ein Image auf die Form ziehe und mit canvas.pixels[i,j]:=rgb(z,z,z) wobei z:=random(255) ist, warum ist das nur schwarz oder weiß?

Sorry, das hab ich wohl überlesen  big_smile

Der selbe Wert für r,g,b ergibt immer Graustufen die von schwarz (0,0,0) bis weiss (1,1,1) (edit: im unit cube natürlich, bei bytewerten ist es (255,255,255)) reichen. Ist eine sehr nützliche Eigenschaft des RGB color cubes.

Zitat:

Das mit den Fraktalen hört sich gut an, mal gugn wie aufwendig sowas ist.

Das Fraktal selbst ist nicht wirklich aufwändig - ich hatte es in 2-3 Stunden implementiert (aber ok, das war auch etwa die Zeit die mir bis zur Abgabe übrig geblieben ist *g*), das überblenden, so dass es dann gut aussieht wird wohl auch nochmal ein paar Stunden dauern - aber wie gesagt, prinzipiell ist es wirklich simpel. Falls du den sourcecode von meinem midpoint replacement Testprogramm haben willst schick mir einfach eine PM, aber erwarte bitte nichts gut dokumentiertes  big_smile

JorEl


Jesus hat gesagt - selig sind die, die da Leid erfahren, denn sie sollen getröstet werden... Ford Prefect hat gesagt - es ist unheimlich wichtig, dass wir miteinander reden und einen trinken.

Offline

 

#5 18.05.2006 08:06:08

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe: Kugel in 2D pixeln (Mitte hell, dunkler nach aussen)

Klar, schick mal den Code.
Ich schick dir meine Email.

Bei dem Problem mit dem Image:

Ich setzte da RGB in Pixel rein, da ist doch min 0 und max 255?

Ich denke eher, ich muss da irgendwas initialisieren weil das im Standard schwarz/weiß ist oder so?

Gruß
Firle

Offline

 

#6 18.05.2006 08:21:06

Coolcat
ProGuru
Ort: Aachen, NRW
Registriert: 24.01.2005
Beiträge: 2780
Web-Seite

Re: Mathe: Kugel in 2D pixeln (Mitte hell, dunkler nach aussen)

Zitat:

wohlgemerkt eine Kugel soll das hinterher sein

Auf den Radius musst du noch mit dem Sinus drüber....dann wird's ne Kugel.

Allgemein empfehle ich dir als Terraingenerator entweder ein beliebiges Grafikprogramm zu benutzen oder Terragen, oder gleich beides.
Für Terragen gibt es Plugins mit denen du das Terrain exportieren kannst.
( http://www.terradreams.de/All/Downloads.php )


My software never has bugs. It just develops random features.

Offline

 

#7 18.05.2006 08:26:22

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe: Kugel in 2D pixeln (Mitte hell, dunkler nach aussen)

Terragen ist mir bekannt, aber danke für den Tip.

Aber ich will halt einen eigenen haben,
ist auch schon halb fertig.

Der soll halt mir eine Ebene machen mit leichten hochrunter, und dann kann ich quasi  mit Maus Berge drauf malen, rauskommen soll dann ein Graustufen-BMP und hinterher ein gesmoostes (wink) Lightmap nach Position der Sonne.

Firle

Offline

 

#8 18.05.2006 08:41:02

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe: Kugel in 2D pixeln (Mitte hell, dunkler nach aussen)

Also, einfach ein Image aufs Form gezogen,
dann Button drauf mit folgendem Code:

Code: delphi

procedure tform1.bitbtn3click(sender: tobject);
var i,j,z: integer;
    r,g,b: byte;
begin
  randomize;
  for i:=0 to image1.width-1 do
  for j:=0 to image1.height-1 do begin
    z:=random(trackbar2.position);
    r:=round(z*2.55);
    g:=r;
    b:=r;
    if random(100)<=trackbar1.position then image1.canvas.pixels[i,j]:=rgb(r,g,b);
  end;
end;



Danach sind Zufallspixel auf dem Image, aber die haben alle genau die gleiche Farbe! Die sollen aber alle Random Farben haben!

Die Werte der Trackbars liegen zwischen 1-100 User-Einstellbar.

Das soll eine Grundfläche liefern, die später gesmoost wird.

Idee?

Danke,
Firle

Offline

 

#9 18.05.2006 08:49:15

JorEl
ExtremeMember
Registriert: 29.01.2005
Beiträge: 894

Re: Mathe: Kugel in 2D pixeln (Mitte hell, dunkler nach aussen)

Hmm... kann es sein, dass du einfach vergessen hast den Zufallsgenerator mit randomize zu initialisieren?

JorEl


Jesus hat gesagt - selig sind die, die da Leid erfahren, denn sie sollen getröstet werden... Ford Prefect hat gesagt - es ist unheimlich wichtig, dass wir miteinander reden und einen trinken.

Offline

 

#10 18.05.2006 08:51:27

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe: Kugel in 2D pixeln (Mitte hell, dunkler nach aussen)

Muss das randomize in die Schleife?

Ich dachte, ein einmaliger Aufruf vorher reicht da...

Firle

Offline

 

#11 18.05.2006 08:55:51

JorEl
ExtremeMember
Registriert: 29.01.2005
Beiträge: 894

Re: Mathe: Kugel in 2D pixeln (Mitte hell, dunkler nach aussen)

Muss (und soll) nur einmal aufgerufen werden - ich mach es meistens direkt vor dem Application.Initialize;

Aber habs schon gesehen, ist ohnehin in deinem source enthalten - also daran liegt es dann wohl nicht.

Vielleicht liegt es ja auch an der rgb routine? Die VCL macht mit dem 4. byte teilweise eigenartige Dinge ist mir aufgefallen. $00FFFFFF wäre weiss, d.h. du solltest sicher stellen, dass das (ich nenne es mal) most significant byte auf 0 gesetzt ist und dann folgt glaube ich die Reihenfolge b g r.

JorEl


Jesus hat gesagt - selig sind die, die da Leid erfahren, denn sie sollen getröstet werden... Ford Prefect hat gesagt - es ist unheimlich wichtig, dass wir miteinander reden und einen trinken.

Offline

 

#12 18.05.2006 09:10:18

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe: Kugel in 2D pixeln (Mitte hell, dunkler nach aussen)

Verstehe ich ehrlich gesagt nicht, das muss doch klappen:

image1.Canvas.Pixels[i,j]:=rgb(r,g,b);

Mit jedem Wert für r,g,b zwischen 0 und 255!

Firle

Offline

 

#13 18.05.2006 09:26:00

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe: Kugel in 2D pixeln (Mitte hell, dunkler nach aussen)

Hallo Jorel,

danke für das Sample. Sieht allerdings einfach nur wie Perlin Noise aus, oder?

Gruß
Firle

Offline

 

#14 18.05.2006 09:26:51

JorEl
ExtremeMember
Registriert: 29.01.2005
Beiträge: 894

Re: Mathe: Kugel in 2D pixeln (Mitte hell, dunkler nach aussen)

Hab mir mal den rgb source angeschaut, müsste eigentlich funktionieren.
Ich kann auch in deinem source eigentlich keinen Fehler finden - und initialisieren muss man beim output auf das canvas auch nichts.

Hmm... naja, du kannst ja auch mal in meinen source schauen den ich dir geschickt habe, dort schreibe ich glaub ich auch auf den canvas von einem TImage. Vielleicht hilft dir das weiter.

JorEl


Jesus hat gesagt - selig sind die, die da Leid erfahren, denn sie sollen getröstet werden... Ford Prefect hat gesagt - es ist unheimlich wichtig, dass wir miteinander reden und einen trinken.

Offline

 

#15 18.05.2006 09:28:22

JorEl
ExtremeMember
Registriert: 29.01.2005
Beiträge: 894

Re: Mathe: Kugel in 2D pixeln (Mitte hell, dunkler nach aussen)

Zitat:

danke für das Sample. Sieht allerdings einfach nur wie Perlin Noise aus, oder?

Perlin Noise ist zwar was ähnliches, aber eben nicht das selbe wie midpoint replacement. Wie gesagt - du musst schon ein paar Dinge anpassen wenn du es mehr oder weniger kreisförmig haben willst, aber ich würde das so lösen, sollte eigentlich gute Ergebnisse bringen.

Falls nicht kann es dir immer noch dabei helfen das Problem mit dem canvas zu lösen  big_smile


Jesus hat gesagt - selig sind die, die da Leid erfahren, denn sie sollen getröstet werden... Ford Prefect hat gesagt - es ist unheimlich wichtig, dass wir miteinander reden und einen trinken.

Offline

 

#16 18.05.2006 12:46:51

artzuk
GodlikeMember
Ort: Leipzig
Registriert: 24.01.2005
Beiträge: 1164

Re: Mathe: Kugel in 2D pixeln (Mitte hell, dunkler nach aussen)

Ich hab da ganz früher mal ein Tutorial gefunden, dort wird eine Heightmap erstellt, die genau nach diesen Prinzip mit den Kreisen arbeitet.
Ich hab sie wieder gefunden smile Guckst du: http://www.robot-frog.com/3d/hills/hill.html


Mein kleiner .NET Blog: http://artzuk-interactive.de/

Offline

 

#17 18.05.2006 13:44:01

firlefanz
GodlikeMember
Ort: Olpe in NRW
Registriert: 31.01.2005
Beiträge: 1035
Web-Seite

Re: Mathe: Kugel in 2D pixeln (Mitte hell, dunkler nach aussen)

@JorEl: Ich glaube, ich weiß woran das liegt mit dem Canvas, bin noch auf der Arbeit, muss ich zu Hause testen.

@Artzuk: Ja, genau sowas schwebt mir vor wink Nur dass ich die Hügel selber malen will, wenns fertig ist zeige ich das mal. Statt einem Pixel soll der halt ne 3D Kugel setzen.

Firle

Offline

 

Brett Fußzeile

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson