Προς το περιεχόμενο

[Αλγόριθμος] Κυκλική τοποθέτηση αντικειμένων γύρω από ένα σημείο...


Alchemist`

Προτεινόμενες αναρτήσεις

Δημοσ.

Παίδες έχω ένα θεματάκι με το παιχνίδι στην υπογραφή μου... Το πρόβλημα λοιπόν είναι πως ψάχνω για έναν αλγόριθμο που θα κάνει αυτό:

 

Έχουμε N instances (πράσινοι κύκλοι) του αντικειμένου "enemy" που θέλουν να μεταβούν στο σημείο που δείχνει το κόκκινο Χ. Ο αλγόριθμος pathfinding τους λέει να πάνε όλα προς τα εκεί. Το πρώτο που θα φτάσει εκεί (σύμφωνα με άλλο script) θα σταματήσει σε απόσταση 32 από το επιθυμητό σημείο, με κατεύθυνση αυτήν που είχε όταν ερχόταν +180 (η κατεύθυνση δίνεται σε μοίρες, 0-360)

 

28433804.jpg

 

95598753.jpg

 

Κάποιο απο τα αντικείμενα θα φτάσει πρώτο εφόσον είναι πιο κοντά, αυτό λοιπόν που θέλω να κάνει ο ζητούμενος αλγόριθμος είναι "το επόμενο αντικείμενο που θα φτάσει εκεί, μόλις κάνει collision με το άλλο, να επιλέξει ένα άλλο σημείο για πάει το οποίο ανήκει στον πορτοκαλί κύκλο ο οποίο έχει κέντρο το κόκκινο σημείο, και ακτίνα 32". Αυτό θα πρέπει να δουλεύει για οποιοδήποτε αριθμό αντικειμένων enemy, και να τοποθετούνται περίπου όπως δείχνει η επόμενη εικόνα:

 

69557173.jpg

 

Επιθυμητό στοιχείο του αλγορίθμου, αλλά όχι απαραίτητο: Ο πορτοκαλί κύκλος θα πρέπει να μεγαλώνει ώστε να χωράνε όλα τα αντικείμενα

 

Ελπίζω να ήταν κατανοητή η εξήγηση του προβλήματος, το οποίο ΔΕΝ ΕΙΝΑΙ ΚΑΜΙΑ ΑΣΚΗΣΗ ΓΙΑ ΠΑΡΑΔΟΣΗ, χρειάζεται για το παιχνίδι.

 

Μερικά Hints ακόμη:

Δεδομένα θεωρούνται τα εξής:

* τα αντικείμενα enemy έχουμε μέγεθος 32χ32, κέτρο τους είναι όμως το relative σημείο 16,16, δλδ το κέτρο του τετραγώνου (κύκλου στο σχήμα).

* το με ποιόν τρόπο θα μεταβούν εκεί δεν σας ενδιαφέρει, ο αλγόριθμος Pathfinding το βρίσκει. Αυτό που θέλουμε είναι ο αλγόριθμος που θα δωθεί να παράγει, ένα decision_x και decision_y το οποίο είναι το κίτρινο σημείο στο σχήμα στο οποίο πρέπει να μεταβεί. Επίσης το πότε έχουμε collision και πότε όχι δεν σας ενδιαφέρει το υπολογίζει και αυτό άλλο script.

 

ΕΥΧΑΡΙΣΤΩ ΠΡΟΚΑΤΑΒΟΛΙΚΑ!!!

Δημοσ.

Λοιπον εστω οτι το κόκκινο σημείο εχει συντεταγμένες (a,B), τότε τα σημεία του πορτοκαλί κύκλου συνδέονται με την σχέση:

(x-a)^2 + (y-B)^2 = r^2 οπου r η ακτίνα του πορτοκαλί κύκλου.

 

Επιλέγεις αυθαίρετα(ή με καποιον αλλο τρόπο) το x για παράδειγμα και βρήσκεις το y από την παραπάνω σχέση.

 

edit:

Αν θες να μεγαλώνει ο κύκλος, θα πρέπει να υπολογίσεις πόσοι εχθροί χωράνε πάνω του (περιμετρος_κυκλου/32), και να μεγαλώνεις την ακτίνα r.

Δημοσ.

Γνωρίζοντας τη θέση του πρώτου εχθρικού αντικειμένου, η θέση στην οποία θα πρέπει να τοποθετηθούν τα επόμενα μπορεί να υπολογιστεί ως εξής: Αρκεί να υπολογίσουμε πρώτα "πόσο" κομμάτι του κύκλου καταλαμβάνει το ένα εχθρικό αντικείμενο (δεδομένου ότι όλα τα εχθρικού αντικείμενα έιναι ίσα και όμοια)

 

circlepositions.jpg

 

Αρκεί δηλαδή να υπολογίσουμε την γωνία ΑKΒ: Απο το ορθογώνιο τρίγωνο kBK έχω:

 

>γωνία ΑΚΒ = 2 * arcsin(r/R) (r<=R) 

 

Άρα το πλήθος των αντικειμένων που μπορούν να χωρέσουν έιναι 360 / ΑΚΒ.

 

Το επόμενο αντικείμενο θα πάει στην θέση του προηγούμενου (ή του πρώτου), μετατοπισμένο κατα γωνία ίση με την ΑΚΒ (ή v*AKB;ή -ν*AKB), ως προς το κέντρο του κύκλου με κέντρο Κ. (Μπρορούμε να προσθέσουμε και κανά δυό μοίρες ακόμα στη ΑΚΒ, για να μην υπάρχει καμία τομή μεταξύ των εχθρικών αντικειμένων). Η διαδικασία θα επεναλαμβάνεται μέχρι να καλύψουμε όλο τον κύκλο. Ελπίζω να βοήθησα (και να έχω κάνει σωστά τις πρ

  • 2 εβδομάδες αργότερα...
Δημοσ.

Παίδες ευχαριστώ πολύ για την βοήθεια, σόρρυ που δεν απάντησα τόσο καιρό...

 

Με τις πληροφορίες που δώσατε το έλυσα το ζήτημα, ευχαριστώ και πάλι! :-)

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...