MustafGames Geschrieben 25. Februar 2017 Melden Share Geschrieben 25. Februar 2017 Hallo, ich habe das hier gefunden: http://answers.unity...sing-cubes.html unter der "Besten Antwort" steht ein Kommentar wo jemand meint das man die Fraktion von PI nehmen sollte damit der Kreis besser aussieht, welcher Wert sollte das sein? Außerdem ist das ja wirklich nur ein Kreis der nicht gefällt ist, wie könnte man das den machen das es ihn auch füllt? Mfg Mustaf Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 25. Februar 2017 Melden Share Geschrieben 25. Februar 2017 Damit meint er z.B: float interval = Mathf.PI / 30.0f; Also einen Bruch von PI, damit hast du auch gleichzeitig die Anzahl der Würfel, also in dem Fall 60 Stück: float numCubes = 60.0f; float interval = Mathf.PI / numCubes / 2.0f; Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MustafGames Geschrieben 25. Februar 2017 Autor Melden Share Geschrieben 25. Februar 2017 Damit meint er z.B: float interval = Mathf.PI / 30.0f; Also einen Bruch von PI, damit hast du auch gleichzeitig die Anzahl der Würfel, also in dem Fall 60 Stück: float numCubes = 60.0f; float interval = Mathf.PI / numCubes / 2.0f; Dachte eigentlich die Anzahl wäre Length (Durchmesser) x = (int)(length * Mathf.Cos (angle)); y = (int)(length * Mathf.Sin (angle)); PS: Hab meine Frage erweitert oben. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mr 3d Geschrieben 25. Februar 2017 Melden Share Geschrieben 25. Februar 2017 Wenn du eh einen gefuellten Kreis willst, ist es sogar um einiges leichter.. du durchlaeufst mit deinen 2 for-Schleifen alle Felder und ueberpruefst, ob der Abstand zum Mittelpunkt kleiner als der Radius ist.. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Felix K. Geschrieben 25. Februar 2017 Melden Share Geschrieben 25. Februar 2017 Hi, gibt es noch andere Anforderungen an den Kreis? z.B: - Sollen die mit einer Fläche zum Zentrum schauen? - Anzahl der Würfel variabel und immer gleichverteilt über den Kreis? - Welchen Abstand sollen die Würfel haben wenn der Kreis gefüllt wird. usw Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 25. Februar 2017 Melden Share Geschrieben 25. Februar 2017 Für einen gefüllten Kreis eine dritte Schleife aufmachen und in dieser Schleife den Radius vom Maximalradius (length) zunehmend verkleinern. Dabei musst du aber bevor du einen Würfel setzt prüfen, ob der neue Würfel mit einem anderen zuvor gesetzten Würfel kollidieren könnte, oder du drehst solange an der Schrittweite bis es passt. Prinzipiell nimmst du für die Schrittweite dabei die Länge des Würfels. Hier fehlt noch der "Überschneidungstest": using UnityEngine; using System.Collections; public class CubeCircle : MonoBehaviour { public GameObject center; public GameObject cube; void Start() { int x, y; int length = 50; float radius = length; float angle = 0.0f; float numCubes = 40; float interval = Mathf.PI / numCubes / 2.0f; float circle_interval = 2f; while (radius > 0) { angle = 0.0f; while (angle < 2 * Mathf.PI) { x = (int)(radius * Mathf.Cos(angle)); y = (int)(radius * Mathf.Sin(angle)); Instantiate(cube, center.transform.position + new Vector3(x, 0, y), Quaternion.identity); angle += interval; } radius -= circle_interval; numCubes -= 1; // ANzahl der Würfel hier mal verkleinern damit es im inneren Bereich nicht zu viele werden interval = Mathf.PI / numCubes / 2.0f; } } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MustafGames Geschrieben 1. März 2017 Autor Melden Share Geschrieben 1. März 2017 cool danke, aber die können sich doch nicht überschneiden wenn man nur volle Koordinaten nimmt also gerundete Zahlen ohne Komma. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 1. März 2017 Melden Share Geschrieben 1. März 2017 Stimmt, daher hier noch einmal eine Version mit einer vollkommen geschlossenen Kreisfläche. Bei circle_interval = 1.0f (daher 0.4) gibt es zwar keine Überschneidungen, aber die Kreisfläche wird nicht vollkommengeschlossen. Auch bei einer Version mit den Koordinaten als int kann die Kreisfläche nicht geschlossen werden (und es gibt unschöne Rasterlöcher, ok man könnte diese Löcher nun mit "Zusatzcubes" stopfen, wenn man sie findet). using UnityEngine; using System.Collections; public class CubeCircle : MonoBehaviour { public GameObject center; public GameObject cube; void Start() { float x, y; float radius = 50; float angle = 0.0f; float interval = (2 * Mathf.PI) / (2 * Mathf.PI * radius); //float circle_interval = 1f; float circle_interval = 0.4f; while (radius > 0) { angle = 0.0f; while (angle < 2 * Mathf.PI) { //x = Mathf.RoundToInt((radius * Mathf.Cos(angle))); //y = Mathf.RoundToInt((radius * Mathf.Sin(angle))); x = radius * Mathf.Cos(angle); y = radius * Mathf.Sin(angle); Instantiate(cube, center.transform.position + new Vector3(x, 0, y), Quaternion.identity); angle += interval; } radius -= circle_interval; interval = (2 * Mathf.PI) / (2 * Mathf.PI * radius); } } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MustafGames Geschrieben 2. März 2017 Autor Melden Share Geschrieben 2. März 2017 Es ergibt bei mir irgendwie keinen schönen Kreis :/ https://donatstudios.com/PixelCircleGenerator Sollte eigentlich so aussehen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mr 3d Geschrieben 2. März 2017 Melden Share Geschrieben 2. März 2017 Hab ich hier irgendwas überlesen, oder habt ihr meinen Post überlesen? ^ Du möchtest doch einen Kreis ala Minecraft mit einem bestimmten Radius generieren, oder? public GameObject Cube; void GenerateCircle(Transform center, int r){ for(int x=0;x<r*2;x++){ for(int y=0;y<r*2;<y++){ float d = Mathf.Sqrt(Mathf.Pow(x-r,2)+Mathf.Pow(x-r,2)); if(d<=r){ Instantiate(Cube, center.position + new Vector3(x-r,0,y-r), Quaternion.identity); } } } } ( nicht getestet.. ) Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mark Geschrieben 2. März 2017 Melden Share Geschrieben 2. März 2017 Boom! Ist es nicht das das hier was du eigentlich suchst: https://de.wikipedia.org/wiki/Rasterung_von_Kreisen Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 2. März 2017 Melden Share Geschrieben 2. März 2017 Es ergibt bei mir irgendwie keinen schönen Kreis :/ https://donatstudios...CircleGenerator Sollte eigentlich so aussehen. Sieht für mich eher "unschön" aus und eher wie ein Quadrat (weil er sich eben dem Raster anpassen muss, aber warum?), aber dafür ist es natürlich 100% symmetrisch.Aber wenn sich die Würfel zwingend am Raster anpassen müssen, dann siehe der Tipp von Mark. Also der Kreis sieht bei mir so aus: Ausgefüllter Kreis: Ok, ist nur zu 99% symmetrisch @Mr 3d: Habe deine Skript auch gleich mal mitgetestet, da kam ein Rechteck aus Würfeln heraus. PS: Um mein Skript weiter zu verbessern (Symmetrie). Könnte man nur einen Quadranten (PI/2) berechnen und die anderen 3 Quadranten einfach spiegeln... Gleich mal umgesetzt: using UnityEngine; using System.Collections; public class CubeCircle : MonoBehaviour { public GameObject center; public GameObject cube; void Start() { float x, y; float radius = 6; float angle = 0.0f; float interval = (2 * Mathf.PI) / (2 * Mathf.PI * radius); float circle_interval = 0.4f; bool full_circle = false; int cnt = 0; while (radius > 0) { angle = 0.0f; while (angle < (Mathf.PI/2.0f + interval/2.0f) && (cnt <1 || full_circle)) { x = radius * Mathf.Cos(angle); y = radius * Mathf.Sin(angle); Instantiate(cube, center.transform.position + new Vector3(x, 0, y), Quaternion.identity); Instantiate(cube, center.transform.position + new Vector3(-x, 0, y), Quaternion.identity); Instantiate(cube, center.transform.position + new Vector3(x, 0, -y), Quaternion.identity); Instantiate(cube, center.transform.position + new Vector3(-x, 0, -y), Quaternion.identity); angle += interval; } radius -= circle_interval; interval = (2 * Mathf.PI) / (2 * Mathf.PI * radius); cnt++; } } } Die ist ein kleiner Hack dabei, ab und an wird der Kreis nicht geschlossen, daher + interval/2.0f. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MustafGames Geschrieben 2. März 2017 Autor Melden Share Geschrieben 2. März 2017 Bei mir liegt es daran, das ich keine Würfel Instantiate sondern per meinen Voxel Script die Würfel setzte, jedoch sind die dann halt immer in dem Raster. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Mr 3d Geschrieben 2. März 2017 Melden Share Geschrieben 2. März 2017 @Zer0Cool: Jo, der code war einfach so im Browser geschrieben, ohne ihn zu testen.. ich habe ein 'y' mit einem 'x' vertauscht.. Hier nochmal richtig ( + kleine Verbesserung ) public GameObject Cube; void GenerateCircle(Transform center, int r) { for (int x = 0; x < r * 2; x++) { for (int y = 0; y < r * 2; y++) { float d = Mathf.Sqrt(Mathf.Pow( ( x + .5f ) - r, 2) + Mathf.Pow( ( y + .5f ) - r, 2)); if (d <= r) { Instantiate(Cube, center.position + new Vector3(x - r, 0, y - r), Quaternion.identity); } } } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sleepy Geschrieben 2. März 2017 Melden Share Geschrieben 2. März 2017 Sieht ja alles sehr kompliziert aus ich als 3dler hätte da nen anderen Ansatz: Den Cube mit Translation 0,0,0 in die Mitte des Kreises nun eine Instanz auf 100,0,0. Der Pivot auf Position 0,0,0 und das Objekt um die Y Achse drehen zb um 18 grad zb 360/18 = 20 mal also 20 mal um 18 grad instanzieren. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.