In un post precedente vi avevo mostrato qual’è il risultato finale che voglio raggiungere realizzando il Play By Chat Migliorato. Lo sviluppo sta procedendo, e siccome sono un pendolare, in treno mi diletto con matematica e geometria, annotando su di un quadernetto a quadretti tutti i miei ragionamenti e le mie conclusioni… Qui a lato trovate un esempio dei miei deliri cartesiani 😀
Di certo se qualche matematico si offrisse di darmi una mano farei molto prima!
A mio parere per quanto riguarda la visuale dovrebbe funzionare così:
Si uniscono i CENTRI dei quadretti e quella definisce la linea di visuale: se la linea è interrotta da un muro allora il quadretto non è visibile. Es: nell’ultima immagine il punto M non è visibile da P in quanto la linea che congiunge i centri di M e P incontra lo spigolo di fianco a M.
Così facendo si ottiene l’approssimazione più corretta che coniuga una pseudo raltà alla già presente approssimazione dei quadretti
in effetti ho provato anche quella via, ma D&D ha una sua meccanica:
http://zaxarius.altervista.org/modules.php?name=Forums&file=viewtopic&p=201191&sid=bbe48d8208381a4b742786e256f27eb6#201191
Ok, rileggendo il regolamento, per capire se un avversario è in copertura, siccome c’è scritto “si scelga un angolo del proprio quadretto”, significa che se un angolo mi genera un fascio che non tocca spigoli, allora l’avversario NON è sotto copertura, quindi basta vedere sempre le diagonali: se almeno una delle 2 tocca un angolo allora l’avversario è sotto copertura. Ma non si può postare un’immagine? Vabbeh te la mando via skype
Invece per sapere se un q
Ops, il post di prima mi è scappato
Dicevo: invece per capire se un quadretto è visibile o meno, la regola è: traccio le 2 diagonali (intendo quella che unisce gli angoli più vicini come x ma più distanti come y, mentre l’altra è quella che unisce gli angoli + vicini come y ma più lontani come x) e se ALMENO UNA è LIBERA, allora il quadretto è visibile
io una volta, 12 anni fa, ti potevo dare una mano…poi ho dimenticato la matematica…il mio cervello ha spazio limitato, per farci entrare la veterinaria qualcosa dovevo eliminare…io aiuto con spritz e patatine, va ben?
servono anche quelli!! ^_^
Premetto che potrei sbagliarmi.
E se creassi un fascio limitato?
Ora mi spiego.
nel disegno che hai postato l’immagine in basso a destra mostra come solitamente viene tracciata la linea di visuale.
Forse per mettere il tutto su un programma sarebbe meglio considerare i quadretti visibili, quindi portare le righe che danno maggior visuale attraverso gli spigoli dei muri.
Prendo come esempio l’immagine che ho citato:
Poniamo un sistema di riferimento cartesiano con origine nello spigolo in basso a sinistra, quindi nominiamo la griglia con un quadretto=1unità, il punto cerchiato è (0,1).
Si tracciano 2 rette inizialmente una che passa da (0,1) e (2,1) che sarà y=1, e la seconda da (1,0) e (2,2) che sarà y=2x -2.
Quindi abbiamo il primo raggio visuale(delimitato dalle due rette).
Poi però dobbiamo determinare una terza retta, poichè c’è un altro spigolo che ci interessa (in teoria 2 ma io faccio l’esempio solo per il mostro),
(9,4).In questo caso, il problema è se può passare, il miglior punto per partire sarebbe (1,0), ma la visuale è bloccata, quindi il computer farà
se r | (9,4)(1,0) appartengono a r interseca un muro
allora
prova con il punto (0,0) ma anchesso interseca un muro
allora prova con (1,1) il quale non interseca un muro.
abbiamo allora due rette la retta y=1 e la retta per (1,1) e (9,4) y=3x/8 + 5/8 e dobbiamo verificare se il quadratino M in questione è compreso tra le due rette(ricordandoci che se M ne tange una ed è esterno all’area compresa tra le due rette esso è “invisibile”).
In questo caso è semplice poichè M interseca la retta y=3x/8+5/8 2 volte, quindi è sicuramente visibile.
Volendo si potrebbe fare la distanza tra le due rette e il quadratino prendendo come punti i punti più vicini, se le distanze non verificano nessuna delle due condizioni:
d(da y=2)=>2d(di una retta dall’altra)
d(da y=y=3x/8+5/8)<=2d(di una retta dall’altra)
allora il quadratino è visibile.
Forse è un po’ criptico come sistema e molto difficile da mettere in pratica ma dato che le operazioni da fare sono minori che “tentare tutte le possibili rette”(16 rette possibili che devi controllare se passano attraverso i muri) potrebbe essere il sistema giusto.
Se non hai capito… non ti biasimo. Più semplice sarebbe stato illustrarlo a voce con una bella lavagna.
Non so se ho fatto degli errori di calcolo, sono quelli che mi fregano sempre.
Mi dispiace di non poterti aiutare nella programmazione vera e propria poiché io compilo in C++ e sono alle prime armi.
Svelo infine che sono in terza superiore ,per ovviare eventuali dubbi.
Scusa se mi sono dilungato e se magari ho saltato qualcosa.
mi son dimenticato, prima di fare tutte le operazioni possibili e immaginabili , bisogna controllare la distanza del quadretto,utilizzando i baricentri dei quadratini.
Per le rette che intersecano gli spigoli bisogna che partano dal punto più favorevole del quadratino del PG quindi da quello più vicino al muro.
Correzioni
Ne ho trovati parecchi di errori nella mia risoluzione:
correzioni
1°) il punto più favorevole è quello più lontano dal muro e più vicino allo spigolo.
2°) la distanza tra le due rette,è un grosso problema, poiché le rette non sono parallele,inoltre le equazioni che ho scritto sono sbagliate mi ci vuole più tempo del previsto, scusate se ho postato senza prima riguardare le mie idee.
2°)per la distanza : si prende il punto del quadrato M tale che la sua distanza dalla retta più lontana sia la minima(si prende il punto più vicino alla retta più lontana)
si conduce per il punto la perpendicolare alla retta più lontana e si trovano le intersezioni con le rette, si impone che le coordinate del punto preso siano comprese tra i due punti(l’estramità della retta più vicina è esclusa).
se la condizione è soddisfatta allora il quadrato è visibile.
Grazie per i preziosi commenti Mark, in settimana mi rimetterò a smanettare coi quadrati quindi le tue idee sono mooooolto apprezzate 🙂
Allora presento l’ultima correzione per ora:
Intanto prima di fare tutto quel procedimento conviene controllare se la retta che congiunge i baricentri dei due quadrati non incontra nulla, perchè se non incontra nulla il quadratino è sicuramente visibile.
Il punto più favorevole per tracciare la retta allo spigolo di un muro è tra quelli più lontani dal muro il più vicino allo spigolo, ovviamente se questo è bloccato(la retta interseca qualcosa prima del muro) allora bisogna vedere qual è il secondo punto:
Intanto è tra i due adiacenti al più favorevole, e dipende da dove si trova lo spigolo.
ora se dallo spigolo tracciamo una retta a 45° dal muro dobbiamo vedere dove si trova il quadratino, se è interno (retta45° – muro) allora il punto più favorevole è,dei due. il più lontano dal muro.
Viceversa se il quadratino è esterno allora il punto è quello più vicino allo spigolo.
#Continuo a lavorarci :P#
Sempre utilizzando le rette puoi considerare tutti i punti interni (condizione esplicitata 3 commenti fa) escludendo gli altri, risparmiano tempo
ma l’avevi già capito vero? 😉
Caro Mark, complimenti davvero per lo scervellamento e per i consigli. Tutti i tuoi ragionamenti sono corretti, ma mi sa che rendere la cosa via web (cioè tutto il tempo di elaborazione per individuare le rette, individuare le distanze, individuare i quadratini di interesse, individuare gli spigoli di interesse, fare i calcoli) darebbe un bel po di problemi di prestazioni. Io semplificherei tutto come scritto nel primo commento, falsando un po le regole ma ottenendo una buona approssimazione
Ci avevo pensato anche io… in effetti è vero, ma il procedimento lo faresti solo con i quadretti che non vedi con la linea che congiunge i centri.
Il metodo che ho consigliato dovrebbe essere più veloce, comunque, di controllare tutti i punti, ma sei tu che devi decidere…
Se pensi che sia troppo gravoso, allora è meglio con i centri, meglio che funzioni male piuttosto che non funzioni affatto.
Mi permetto però di dare un ultimo consiglio, se invece di applicare la regola ad ogni singolo quadrato tu ti costruissi prima il cono visivo? dopo di che prenderesti i quadretti in mezzo.Questo non dovrebbe essere troppo gravoso.
Comunque so che parlando in termini di programmazione è difficile.
Ho controllato a mano la teoria “se i centri sono visibili allora i quadrati si vedono”, e purtroppo ho trovato un’eccezione, per cui la regola non è valida 🙁 Ecco l’eccezione: http://img9.imageshack.us/img9/8125/nocentrozf3.png
@Mark, in effetti è già stata costruita l’area visibile (non cono perchè non controlli anche la direzione in cui stai guardando), quindi si tratta di controllare i quadretti dentro un cerchio. Inoltre sto pensando a un modo per individuare i quadretti che stanno “dietro” a quelli già non visibili. Quindi questi li marchi come sicuramente non visibili e non devi controllarli
Jure, in effetti lo avevo già trovato, ma il manuale parla chiaro:
Il quadretto è visibile se è possibile mandare una linea da un qualsiasi punto dello spazio del giocatore a qualsiasi punto dell’altro giocatore.
Quindi non è una eccezione.
Ok, quindi utilizzare solo il centro sarebbe un’approssimazione per difetto, ovvero utilizzando solo il centro vedi visibili meno quadretti di quanti ce ne siano in realtà
Esattamente
Scusate se mi intrometto senza troppa cognizione di causa (visto che in pratica non sò se ciò che stò per dire è fattibile), ma non basta attivare un ciclo annidato che per ogni spigolo calcola una retta verso un’altro spigolo e controlla che questa non intersechi null’altro, e ripetere il ciclo per ogni spigolo da ogni spigolo..? Lo so che a spiegarmi faccio schifo 😛 provo a rendere in pseudocodice;
Soppunendo A come quadrato di origine e B come quadrato “in possibile copertura”, e quindi A1,A2,A3,A4,B1,B2,B3,B4 gli spigoli:
$n, $h : Int;
$Answer boolean;
$Answer:=TRUE;
Loop ( $n da 1 a 4 ){
IF $answer=True THEN
Loop ($h da 1 a 4){
creo retta da A$n a B$h;
$answer:=retta_interseca;
IF $answer=True THEN
$h:=$h+1;
ELSE
ExitLoop;
ENDIF;
};
$n:=$n+1;
ELSE
ExitLoop;
ENDIF;
};
IF $answer:=False THEN
“L’area è visibile”.
ENDIF;
Si, lo so che non sono capace neppure di scrivere in pseudocodice, ma spero di essere stato suficientemente chiaro. Non mi sono letto come funziona il tutto perciò magari ho scritto un post inutile 😛
Purtroppo il manuale dichiara che un quadretto è visibile se è possibile mandare una linea da un qualsiasi punto dello spazio del giocatore a qualsiasi punto dell’altro giocatore, quindi non bastano gli spigoli 🙁 Probabilmente procederemo con un semplice raycasting tanto per cominciare, per poi lavorare ad un sistema più elaborato. Se vuoi puoi contribuire!
Se nessun vertice della casella A è collegabile a uno dei vertici della casella B allora nessun punto delle due caselle è collegabile.
Questo è vero se stiamo parlando di una griglia e gli ostacoli sono costruiti su di essa.
Non ho trovato eccezioni a questa regola… quindi potrebbe funzionare
Ecco un’eccezione: http://bit.ly/exCBaT
o.o chi l’avrebbe mai detto! d&d è sempre una sorpresa, scusa la mia esuberanza ma ne ero proprio convinto 😀
hehehe ci son rimasto male anch’io la prima volta! 😉
dunque:
-si colleghino i rispettivi vertici delle due caselle come in figura
http://img34.imageshack.us/img34/2903/losbase.jpg
-l’area sottesa dai segmenti è il fascio visivo delle due caselle, cioè la capacità di vedersi l’un l’altro
http://img140.imageshack.us/img140/2808/losbase2.jpg
-per interrompere il fascio visivo bisogna ostacolarlo completamente, come in questo caso
http://img4.imageshack.us/img4/4650/losbase3.jpg
in questo modo si rispettano le dinamiche da manuale
scatta la caccia all’eccezione! =D
spero di esserti stato d’aiuto
questo è un caso in cui il fascio visivo è interrotto da un ostacolo aperto
http://img16.imageshack.us/img16/2290/39447576.jpg
e questo è l’esempio di un fascio visivo tra due creature di taglia differente
http://img543.imageshack.us/img543/4300/53769120.jpg
il verde indica la visuale oltre la porta, il rosso indica la parte visibile della creatura