Post

Visualizzazione dei post con l'etichetta Formule

Find Point of Intersection of Two Lines

  pdd LinesIntersection(pdd A, pdd B, pdd C, pdd D) {      // Line AB represented as a1x + b1y = c1      double a1 = B.second - A.second;      double b1 = A.first - B.first;      double c1 = a1*(A.first) + b1*(A.second);          // Line CD represented as a2x + b2y = c2      double a2 = D.second - C.second;      double b2 = C.first - D.first;      double c2 = a2*(C.first)+ b2*(C.second);          double determinant = a1*b2 - a2*b1;          if (determinant == 0)      {          // The lines are parallel. This is simplified          // by returning a pair of FLT_MAX          return make_pair(FLT_MAX, FLT_MAX); ...

Sort Points by clockwise Angle

Immagine
    Points[4] = {...};     Point origin; ...     // Sort Points by Angles     for(int m=0; m<3; m++)         for (int i = m + 1; i < 4; i++)         {             if (GetClockwiseAngle(Points[i], origin) < GetClockwiseAngle(Points[m], origin);)             {                                SwapPoint(Points, i, m);                }         }         ... double GetClockwiseAngle(Point point, Point origin) {     double angle = 0.0;     angle = atan2(point.Y - origin.Y, point.X - origin.X) * 180 / M_PI;; ...

Middle point of a line segment

Immagine
A(x,y) B(x,y) MidAB.X = (A.X + B.X) / 2; MidAB.Y = (A.Y + B.Y) / 2;

Rotate Point Around Origin

//---------------------------------------------------------------------------- void RotatePointAroundOrigin(&Point, Point origin, double angle) {     float s = sin(angle);     float c = cos(angle);     // Translate point back to origin:     point.X -= origin.X;     point.Y -= origin.Y;     // Rotate point     float xnew = point.X * c - point.Y * s;     float ynew = point.X * s + point.Y * c;     // Translate point back:     point.X = xnew + origin.X;     point.Y = ynew + origin.Y; }

Angle between two points

//---------------------------------------------------------------------------- double CalculateAngle(Point point1, Point point2, Point origin) {     double angleToP1 = atan2((point1.X - origin.X), (point1.Y - origin.Y));     double angleToP2 = atan2((point2.X - origin.X), (point2.Y - origin.Y));     double angle = angleToP2 - angleToP1;     if (angle < 0) angle += (2 * vtkMath::Pi());         return angle; }

Hello world - Formule Utili

//Distanza tra due punti -------------------------------------------------------------- double Distance(Vect2d p1, Vect2d p2) {   double dx = p2.x - p1.x;   double dy = p2.y - p1.y;   return sqrt((double)dx*dx + dy*dy); }; //Distanza tra un punto e un segmento -------------------------------------------------------------- double DistanceToLine(Vect2d lineP1, Vect2d lineP2, Vect2d point) {   double normalLength = _hypot(lineP2.x - lineP1.x, lineP2.y - lineP1.y);    double distance = (double)((point.x - lineP1.x) * (lineP2.y - lineP1.y) - (point.y - lineP1.y) * (lineP2.x - lineP1.x)) / normalLength;   return abs(distance); }

Hello world - Distanza tra 2 punti

double   Distance ( Vect2d   p1 ,  Vect2d   p2 ) {    double   dx  =  p2 . x  -  p1 . x ;    double   dy  =  p2 . y  -  p1 . y ;    return   sqrt (( double )  dx * dx  +  dy * dy ); }

Hello world - Estendere un segmento

Immagine
   Vect2d   LineP1 ,  LineP2 ;    double   m_MarginLeft = -1000 ,   double   m_MarginRight = 1000 ;    Vect2d   newLineP1 ,  newLineP2 ,  delta ;    delta . x  =   LineP2 . x  -  LineP1 . x ;    delta . y  =   LineP2 . y  -  LineP1 . y ;    double   ratio  =  delta . y  /  delta . x ;    newLineP1 . x  =  m_MarginLeft ;    newLineP1 . y  =  LineP1 . y  - (( LineP1 . x  -  m_MarginLeft ) *  ratio );    newLineP2 . x  =  m_MarginRight ;    newLineP2 . y  =  LineP2 . y  + (( m_MarginRight  -  LineP2 . x ) *  ratio );

Hello world - Rogue - Nuovo Approccio

Immagine
Poiché mi sono reso conto della mia difficoltà a spiegare in maniera chiara ed esaustiva le tecniche e gli algoritmi volendo evitare tecnicismi e codici chilometrici, mi accingo a raccontarvi, in maniera molto discorsiva ed in pillole, la nascita, lo sviluppo  e spero la riuscita di un nuovo progetto. In questo primo post vi accenno solamente il genere, la piattaforma e qualche altro piccolo indizio  per darvi l’idea: Roguelike, Silverlight per Windows Phone 7, ambientazione fantasy ma in chiave ironica con battute, parodie e nemici improbabili. Nome in codice: Rogue Se vi ho incuriosito, rimanete sintonizzati. Cercherò di aggiornare frequentemente il blog con gli sviluppi di questo ambizioso progetto. Saluti   

Hello world - Angolazioni

Immagine
Paddle.Curve = 0.005; Ball.Speed.X = (Ball.Position.X - (Paddle.Position.X + (Paddle.Width / 2)) * Paddle.Curve;

Hello world

Il primo post per questa categoria non poteva avere altro titolo. Senza dilungarmi troppo, vorrei illustrare (a me stesso prima di tutto) qual è l’intento che vorrei portare avanti in questo nuovo spazio. Cercherò di raccogliere e schematizzare gli elementi salienti che concernono lo sviluppo di un videogioco. Aspetti tecnici si, ma anche concetti di base che agli esperti potrebbero sembrare banali ma ogni tanto non è proprio così. Non scriverò trattati, ne formuloni o chilometrici listati di codice incomprensibile. Cose chiare. Commenti, spiegazioni, interpretazioni (che potrei aver io stesso frainteso), schemini, disegni, appunti, e perché no … qualche battuta se verrà fuori, un po’ di vita vissuta, ricette, consigli e tutto quello che in questo momento mi sfugge. Ovviamente, commenti, segnalazioni, insulti etc saranno ben graditi. Buona lettura e buona scrittura … di videogames Il Programmatore

Il cifrario di Cesare

Immagine

Mesa

Immagine
Consideriamo lo schema. Sette cerchi concentrici divisi in 8 sezioni. Per quattro di queste è indicato un numero, anche se il quarto è poco leggibile. Assegnammo per comodità una lettera ad ogni settore, quindi avremo: A=? - B=4 - C=? - D=7 - E=? - F= sembrerebbe un … - G=? - H=1 Adesso passiamo alla linea che percorre le circonferenze. Partendo dall’esterno, in corrispondenza delle sezioni, la linea passa alla circonferenza più interna. Segnando ogni passaggio si ottiene la sequenza: ACEFCFAC quindi basterà sostituire i numeri alle lettere. Considerando che nella sequenza è presente F (che sembrerebbe un..) ma soprattutto visto che non sono presenti B D H cioè 4 7 1, i tentativi si riducono a 2 3 5 6 8 9.  

Angolazioni

Immagine
  Paddle.Curve = 0.005; Ball.Speed.X = (Ball.Position.X - (Paddle.Position.X + (Paddle.Width / 2)) * Paddle.Curve;