Ich habe mir in diesen Ferien mal Cycrows Cheat-Paket vorgenommen. Dabei habe ich z.B. eine Abfrage erstellt wie viele Stationsbauteile
Eingeladen werden sollen. Oder, dass man beim Sektoren aufdecken auch gleich Erweiterte Satelliten in jeden Sektor mit hinein bekommt.
Nun aber zu meinem eigendlichen Problem:
im Script z.cheat.cycrow.createastroid wollte ich nun mehrere Asteroiden
in einem Würfel Erzeugen- natürlich wieder mit einer Abfrage, wie viele denn erstellt werden sollen. Ich habe das in Java schon mal vorprogrammiert:
http://img441.imageshack.us/img441/8485/javaexample.jpg
a=Math.pow(eingabe, (1.0/3));// gibt die 3. Wurzel ungefähr an
b= (int) (a+ 0.5);// rundet den Betrag für int zahlen
Soweit zu Java wo es noch Funktionierte, jetzt zum SE von X³tc
001 $page.id=get global variable: name='cycrow.cheat.pageid'
002
003 $text= read text: page=$page.id id=1034
004 $sector.pos=[THIS] -> get user input: type=Var/Sector Position, title=$text
005 skip if$sector.pos
006 ║return null
007
008 $subtypes= get number of subtypes of maintype [SSTYPE_W_MINERALS]
009 $aResouce= array alloc: size=$subtypes
010 while$subtypes
011 ║dec $subtypes=
012 ║$ware= get ware from maintype [SSTYPE_W_MINERALS] and subtype $subtypes
013 ║$aResouce[$subtypes] = $ware
014 end
015 $aResouce= sort array $aResouce
016 $text= read text: page=$page.id id=1039
017 $text2= read text: page=$page.id id=1038
018 $resource= open custom menu: title=$text description=$text2 option array=$aResouce
019 skip if$resource != -1
020 ║return null
021
022 $ware=$aResouce[$resource]
023 $resource= get subtype of ware $ware
024
025 $text= read text: page=$page.id id=1037
026 $yield=[THIS] -> get user input: type=Var/Number, title=$text
027 skip if$yield
028 ║return null
029
030 $x=$sector.pos[0]
031 $y=$sector.pos[1]
032 $z=$sector.pos[2]
033 $sector=$sector.pos[3]
034
035 $text= read text: page=$page.id id=1064
036 $text2= read text: page=$page.id id=1065
037 $text=sprintf: fmt=$text, $text2, null, null, null, null
038 $anzahl.astro=[THIS] -> get user input: type=Var/Number, title=$text
039 $drittel=1 / 3
040 $Seite.Wrf=$anzahl.astro ^ $drittel //hier sollte eig. die Potenz anzahl.astro "hoch"1/3 hin
041
042 $type= get number of subtypes of maintype [SSTYPE_ASTEROID]
043 $type= = random value from 0 to $type - 1
044 $astro= create asteroid: type=$type addto=$sector resource=$resource yield=$yield x=$x y=$y z=$z
045 $anti.Seite.1=0
046 $anti.seite.2=0
047 $anti.seite.3=0
048 $counter=0
049 $x2=$x
050 $y2=$y
051 $z2=$z
052
053 write to player logbook $anzahl.astro
054 write to player logbook $drittel
055 write to player logbook $Seite.Wrf
056
057 while$anti.Seite.1 <= $Seite.Wrf AND $ende != 4
058 ║while$anti.seite.2 <= $Seite.Wrf AND $ende != 4
059 ║║while$anti.seite.3 <= $Seite.Wrf AND $ende != 4
060 ║║║inc $counter=
061 ║║║skip if$counter == $anzahl.astro
062 ║║║║$ende=4
063 ║║║inc $anti.seite.3=
064 ║║║$x2=$x2 + 10000
065 ║║║$type= get number of subtypes of maintype [SSTYPE_ASTEROID]
066 ║║║$type= = random value from 0 to $type - 1
067 ║║║$astro= create asteroid: type=$type addto=$sector resource=$resource yield=$yield x=$x2 y=$y2 z=$z2
068 ║║end
069 ║║$x2=$x
070 ║║$y2=$y2 + 10000
071 ║║inc $anti.seite.2=
072 ║end
073 ║$y2=$y
074 ║$z2=$z2 + 10000
075 ║inc $anti.Seite.1=
076 end
077 $z2=$z
078 $counter=0
079
080
081 STARTspeak text: page=13 id=1100016 priority=10
082 return $astro
So sieht das Skript derzeitig aus.
Die 3 Logboock commands werfen bei Eingabe von 64 anzahl.astro:64(is halt die Eingabe); drittel:0 (is ja klar weil int wird immer abgerundet);Seite.wrf:64 (liegt halt am Zirkumflex, welches keine Potenz erstellt)
Nun meine Frage:
Ist es irgendwie möglich die 3. Wurzel zu erzeugen?
3.Wurzel;Potenzen und Kommastellen
Moderators: Scripting / Modding Moderators, Moderatoren für Deutsches X-Forum
-
- Posts: 28
- Joined: Fri, 17. Dec 10, 23:37
Auch wenn ich mit dem SE nicht so bewandert bin, kann ich dir trotzdem erklären, wie man das Problem mathematisch angeht. Das Prinzip hier ist Intervallschachtelung: du suchst dir zwei zahlen, von denen eine über und eine unter der gesuchten Zahl liegt, zum Beispiel 1 und die Zahl, von der du die dritte Wurzel haben willst. Die dritte Wurzel liegt nun dazwischen.
Du weisst jetzt also, das sich die dritte Wurzel im Bereich zwischen 1 und der Zahl befindet. Jetzt nimmst du dir eine Zahl zwischen deinen beiden Zahlen, und prüfst ob diese unter oder über der gesuchten Zahl (der 3ten Wurzel) liegt. Hier empfiehlt es sich den Mittelwert der Beiden Zahlen zu nehmen. diese neue Zahl nimmst du nun hoch drei und prüfst, ob das Ergebnis über oder unter deiner ursprünglichenm zahl(von der du die Wurzel haben wolltest) liegt.
Wenn das Ergebnis grösser ist als die ursprünglicheZahl, weisst du, das die dritte Wurzel zwischen der neuen Zahl und 1 liegt. Wenn das Ergebnis kleiner ist, liegt sie zwischen der ursprünglichen und der neuen Zahl.
Auf diese Weise verringerst du den Bereich, in dem sich die Wurzel befindet, d.h. du kannst sie immer genauer bestimmen. Wenn dein Intervall jetzt einen ausreichend kleinen Zahlenbereich umfasst (zum Beispiel: Bereich ist kleiner als 1/100), kannst du irgendeinen Wert aus dem Intervall nehmen, der dann sehr nahe an der gesuchten Wurzel liegen wird. Wenn du den Wert rundest, dürfte es sogar egal sein, welchen Wert des Intervaklls du nimmst.
Beispiel:
dritte Wurzel von neun:
Erstes Intervall: (1;9)
Mittelwert 5
^3 = 125 -> zu groß
Zweites Intervall: (1;5)
Mittelwert 3
^3 = 27 -> zu groß
Drittes Intervall: (1;3)
Mittelwert 2
^3 = 8 -> zu klein
Viertes Intervall: (2;3)
Mittelwert 2,5
^3 = 15,625 -> zu groß
Fünftes Intervall: (2;2,5)
Hier kannst du schon aufhören, weil nach dem Runden auf jeden Fall zwei herauskommt.
Das ganze kann man durch geschickte Wahl der Startwerte und der Prüfwerte noch optimieren; Da wird das ganze dann aber deutlich komplizierter. Nur um das Prinzip zu zeigen.
Du weisst jetzt also, das sich die dritte Wurzel im Bereich zwischen 1 und der Zahl befindet. Jetzt nimmst du dir eine Zahl zwischen deinen beiden Zahlen, und prüfst ob diese unter oder über der gesuchten Zahl (der 3ten Wurzel) liegt. Hier empfiehlt es sich den Mittelwert der Beiden Zahlen zu nehmen. diese neue Zahl nimmst du nun hoch drei und prüfst, ob das Ergebnis über oder unter deiner ursprünglichenm zahl(von der du die Wurzel haben wolltest) liegt.
Wenn das Ergebnis grösser ist als die ursprünglicheZahl, weisst du, das die dritte Wurzel zwischen der neuen Zahl und 1 liegt. Wenn das Ergebnis kleiner ist, liegt sie zwischen der ursprünglichen und der neuen Zahl.
Auf diese Weise verringerst du den Bereich, in dem sich die Wurzel befindet, d.h. du kannst sie immer genauer bestimmen. Wenn dein Intervall jetzt einen ausreichend kleinen Zahlenbereich umfasst (zum Beispiel: Bereich ist kleiner als 1/100), kannst du irgendeinen Wert aus dem Intervall nehmen, der dann sehr nahe an der gesuchten Wurzel liegen wird. Wenn du den Wert rundest, dürfte es sogar egal sein, welchen Wert des Intervaklls du nimmst.
Beispiel:
dritte Wurzel von neun:
Erstes Intervall: (1;9)
Mittelwert 5
^3 = 125 -> zu groß
Zweites Intervall: (1;5)
Mittelwert 3
^3 = 27 -> zu groß
Drittes Intervall: (1;3)
Mittelwert 2
^3 = 8 -> zu klein
Viertes Intervall: (2;3)
Mittelwert 2,5
^3 = 15,625 -> zu groß
Fünftes Intervall: (2;2,5)
Hier kannst du schon aufhören, weil nach dem Runden auf jeden Fall zwei herauskommt.
Das ganze kann man durch geschickte Wahl der Startwerte und der Prüfwerte noch optimieren; Da wird das ganze dann aber deutlich komplizierter. Nur um das Prinzip zu zeigen.
Alle Angaben ohne Gewähr.
Wer Rechtschreibfehler findet, darf sie behalten. Oder auch nicht. Mir egal.
Wer Rechtschreibfehler findet, darf sie behalten. Oder auch nicht. Mir egal.
-
- Moderator (Script&Mod)
- Posts: 14571
- Joined: Sun, 20. Nov 05, 22:45
ich denke es reicht ihm, wenn er es auf die Einerstelle genau bestimmen kann
oder hast du schon mal ne zehntel Mine gebaut?




if not stated otherwise everything i post is licensed under WTFPL
Ich mache keine S&M-Auftragsarbeiten, aber wenn es fragen gibt wie man etwas umsetzen kann helfe ich gerne weiter
I wont do Script&Mod Request work, but if there are questions how to do something i will GLaDly help
Ich mache keine S&M-Auftragsarbeiten, aber wenn es fragen gibt wie man etwas umsetzen kann helfe ich gerne weiter

I wont do Script&Mod Request work, but if there are questions how to do something i will GLaDly help

-
- Posts: 28
- Joined: Fri, 17. Dec 10, 23:37
Hab ich im Beispiel ja auch gesagt. Wenn er weiss, das die Zahl zwischen zwei und 2,5 liegt, kommt nach dem Runden 2 raus -> Fall gelöst 


Du etwa nichtoder hast du schon mal ne zehntel Mine gebaut?

Alle Angaben ohne Gewähr.
Wer Rechtschreibfehler findet, darf sie behalten. Oder auch nicht. Mir egal.
Wer Rechtschreibfehler findet, darf sie behalten. Oder auch nicht. Mir egal.
-
- Moderator (Script&Mod)
- Posts: 14571
- Joined: Sun, 20. Nov 05, 22:45
nö, ich baue keine halben sachen und erst recht keine zehntelXaios wrote:Du etwa nichtoder hast du schon mal ne zehntel Mine gebaut?


if not stated otherwise everything i post is licensed under WTFPL
Ich mache keine S&M-Auftragsarbeiten, aber wenn es fragen gibt wie man etwas umsetzen kann helfe ich gerne weiter
I wont do Script&Mod Request work, but if there are questions how to do something i will GLaDly help
Ich mache keine S&M-Auftragsarbeiten, aber wenn es fragen gibt wie man etwas umsetzen kann helfe ich gerne weiter

I wont do Script&Mod Request work, but if there are questions how to do something i will GLaDly help

-
- Posts: 3728
- Joined: Fri, 19. Dec 03, 10:36
intervallschachtelung ist ganz schön rechenintensiv.
wenn du spaß an mathematik hast, programmier doch das iterative new-verfahren
http://de.wikipedia.org/wiki/Newton-Verfahren
hat den vorteil, dass du einmal etwas rechenzeit investierst und dann iterativ bis zur gewünschten genauigkeit weitergehen kannst.
wenn du spaß an mathematik hast, programmier doch das iterative new-verfahren
http://de.wikipedia.org/wiki/Newton-Verfahren
hat den vorteil, dass du einmal etwas rechenzeit investierst und dann iterativ bis zur gewünschten genauigkeit weitergehen kannst.