Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi "weiche übergänge" in arrays (https://www.delphipraxis.net/22192-weiche-uebergaenge-arrays.html)

glkgereon 13. Mai 2004 21:30


"weiche übergänge" in arrays
 
hi
ich hab ein 2d-array aus bytes
da sollen zunächst mal zufällige werte rein
nun soll aber eine 0 nicht neben einer 200 liegen, es soll sozusagen "weiche übergänge" geben
wie kann ich das realisieren?

PS:
einige werden schon verstanden haben: Ja, es geht um heightmaps :-D

tommie-lie 13. Mai 2004 22:02

Re: "weiche übergänge" in arrays
 
Du gehst jetzt vermutlich mit 'ner Schleife jedes Element durch und weist ihm den Random-Wert zu.
Jetzt merkst du dir den Wert aus dem letzten Element und sorgst dafür, daß die Differenz nicht größer als 5 ist. Ist z.B. der vorherige Wert 200 erzeugst du einen Random-Wert zwischen 0 und 10 und addierst anschließend 195 drauf, schon hast du einen Wert der maximal um 5 vom benachbarten abweicht.
Um alle 8 Nachbarn eines Elementes zu berücksichtigen würde ich zunächst alle Elemente auf -1 initialisieren *) und anschließend den Mittelwert aus allen Nachbarn nehmen, den ich dann als Basis für den aktuellen nehme.
Pseudocode:
Code:
const
  Differenz = 5;

for i := 0 to Length(arr) do
  for j := 0 to Length(arr[i]) do
  begin
    arr[i,j] := Random(2*Differenz + 1) + (GetAverageFromNeighbours(i,j) - Differenz);
  end;

*) Edit: Auf -1 initialisieren, damit GerAverageFromNeighbours weiß, welche Nachbarn es berücksichtigen soll, sonst ziehen die ganzen Nullen aus den noch nicht bearbeiteten Werte den ganzen Durchschnitt runter.

glkgereon 14. Mai 2004 19:26

Re: "weiche übergänge" in arrays
 
jaja, das problem ist dieses, es soll ja nicht so aussehen:

1 5 10 15 20 25
30 32 40 45 50 55
60 65 70 75 80 85

es geht mir jetzt nicht ums ansteigen, sondern darum, das der array in beiden "richtungen" "weich" ist....

GuenterS 14. Mai 2004 19:32

Re: "weiche übergänge" in arrays
 
naja dann nimmst Du einen doppelt so großen Bereich und ziehst vom ergebnis die hälfte ab...

glkgereon 14. Mai 2004 19:35

Re: "weiche übergänge" in arrays
 
nein, ich will das der array sowohl in der wagerechten als auch in der senkrechten weiche übergänge hat

stellt es euch mal als bild vor :wink:

denn das will ich ja letztendlich damit machen ... :-D

supermuckl 14. Mai 2004 19:48

Re: "weiche übergänge" in arrays
 
machs doch so..

generier dir erstmal ein grobes array das dir die berge und täler definiert

dann machst du daraus ein hochauflösenderes array wo die zwischenwerte berechnet...

das könntest du wiederum auch mit mehreren immer höher auflösenden arrays immer feiner machen und bei jeder stufe *vielleicht*
nochmal bisschen random werte generierst ( zur "berechneten zwischenhöhe" zwischen den grobauflösenden array punkten )

also immer weiter aufdröseln.. so müsste das dann denk ich mal in X und Y Richtung weich erscheinen
( vielleicht müsste man sich da einen Algorithmus ausdenken der in der Mitte von 4 Punkten(sozusagen die Pfeiler) den Mittelwert berechnet ( Höhe zwischen den "Pfeilern" ) ) also das das dann wie ein spinnennetz aussieht das runterhängt wo keine "Pfeiler" (grobe array Punkte) sind

.. ich weis ich hab das jetzt voll beschissen erklärt *g* falls du das nich gepeilt hast mach ich ne zeichnung

glkgereon 14. Mai 2004 19:51

Re: "weiche übergänge" in arrays
 
ohh, schwierig

ich weiss nit

mal gucken..

kannste dir event mal ein kelines beispeil-code ausdenken?

weiss nämlich nicht 100 pro ob ichs verstanden hab :-D

supermuckl 14. Mai 2004 20:02

Re: "weiche übergänge" in arrays
 
Liste der Anhänge anzeigen (Anzahl: 1)
hab mal drüber nachgedacht nochmal..
hab Skizze angehängt ( PNG := Internetexplorer )

glkgereon 14. Mai 2004 20:05

Re: "weiche übergänge" in arrays
 
ok, hier das prinzip beschrieben:

groben array machen

in grösseren array übertragen
dabei so strecken, das zwischen allen punkten je 1 punkt absttand ist

den zwischenpunkt zum glätten nutzen

das ganze paar mal wirderholen

dizzy 14. Mai 2004 20:12

Re: "weiche übergänge" in arrays
 
Das Verfahren nennt sich "lieneare Interpolation". Selbiges wird zum "schönen" Vergrößern von Bitmaps verwendet. Du wirst, wenn du mit einem z.B. 8x8-Array beginnst, und es so auf 256x256 hoch-interpolierst etwas unschöne Effekte haben. Das ganze wird relativ "blockig". Du könntest mal im Netz nach anderen Interpolationsmethoden suchen, etwa bi-/trilinear, quadratisch usw.

Auch eine Möglichkeit wäre es, einfach "wirkich" mit einem kleinen Bitmap anzufangen, und dieses mittels der Graphics32-Lib ( www.g32.org ) hochzurechnen. Die Lib hat nämlich schon 5 (oder 6) verschiedene Interpolationsverfahen drin. Lässt sich somit sehr einfach nutzen!

Und das ganze soll ja scheinbar eine Höhen-Map werden, gell!? Wenn du naturnahe Landschaften erzeugen willst, dann wäre ein anderer Ansatz geeigneter. Dafür verwendet man meist "Perlin-Noise". Auch hierzu wid man im Netz ordentlich fündig ;)
Ist aber mit deutlich mehr Aufwand verbunden. Hab ich mich auch noch nicht dran getraut, werd's aber in absehbarer Zeit tun :)


gruss,
dizzy


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:35 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz