3.Wurzel;Potenzen und Kommastellen

Hier ist der ideale Ort um über Scripts und Mods für X³: Terran Conflict und X³: Albion Prelude zu diskutieren.

Moderators: Scripting / Modding Moderators, Moderatoren für Deutsches X-Forum

Laserzwölf und 1
Posts: 28
Joined: Sun, 7. Feb 10, 09:10
x4

3.Wurzel;Potenzen und Kommastellen

Post by Laserzwölf und 1 »

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?
User avatar
Xaios
Posts: 28
Joined: Fri, 17. Dec 10, 23:37
x3tc

Post by Xaios »

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.
Alle Angaben ohne Gewähr.
Wer Rechtschreibfehler findet, darf sie behalten. Oder auch nicht. Mir egal.
UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader »

ich denke es reicht ihm, wenn er es auf die Einerstelle genau bestimmen kann :D oder hast du schon mal ne zehntel Mine gebaut? :D :P
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 ;)
User avatar
Xaios
Posts: 28
Joined: Fri, 17. Dec 10, 23:37
x3tc

Post by Xaios »

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 :D
oder hast du schon mal ne zehntel Mine gebaut?
Du etwa nicht :?
Alle Angaben ohne Gewähr.
Wer Rechtschreibfehler findet, darf sie behalten. Oder auch nicht. Mir egal.
UniTrader
Moderator (Script&Mod)
Moderator (Script&Mod)
Posts: 14571
Joined: Sun, 20. Nov 05, 22:45
x4

Post by UniTrader »

Xaios wrote:
oder hast du schon mal ne zehntel Mine gebaut?
Du etwa nicht :?
nö, ich baue keine halben sachen und erst recht keine zehntel :D :P
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 ;)
|K.O.S.H.
Posts: 3728
Joined: Fri, 19. Dec 03, 10:36
x3tc

Post by |K.O.S.H. »

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.
Wing Commander Mod - German Topic
06.07.11 - v1.1 RELEASED!

Return to “X³: Terran Conflict / Albion Prelude - Scripts und Modding”