n° 219
Novembre 2017
Dicembre 13, 2017, 08:58:50 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia:
 
   Indice   Linux Windows Techassistance Gameassistance videogame hardware Aiuto Ricerca Agenda Downloads Accedi Registrati  


* Messaggi recenti
Messaggi recenti
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: Ruotare una bitmap  (Letto 3032 volte)
0 utenti e 1 Utente non registrato stanno visualizzando questa discussione.
escotobar
Jr. Member
**

Karma: +0/-9
Scollegato Scollegato

Messaggi: 100


Mostra profilo
« inserita:: Ottobre 30, 2010, 02:42:48 »

Sto scrivendo un programma che deve poter RUOTARE delle bitmap.

Facendo delle ricerche con Google ho trovato le funzioni che mi servono
pero' ho un problema: come esempio ho scritto un programma che dovrebbe
ruotare una ellisse, intorno alla ellisse viene disegnato un rettangolo
che contiene l'ellisse ruotata (tralascio la funzione che ruota la
bitmap - in questo caso l'ellisse - per motivi di spazio), variando
l'angolo di rotazione vengono disegnati tanti rettangoli, il problema
e' che vorrei che i rettangoli fossero tutti INTORNO all'ellisse,
invece sono tutti prossimi all'angolo superiore sinistro della TImage.

Nel programma completo quando si seleziona un disegno deve apparire
il rettangolo che, spostando il mouse tenendo premuto il tasto sinistro,
RUOTA intorno al disegno, rilasciando il tasto sinistro del mouse la
bitmap viene ruotata come indicato dal rettangolo.

Ho preparato un programma d'esempio.
Ripeto il problema: vorrei che al variare dell'angolo TUTTI i rettangoli
fossero intorno all'ellisse, invece sono tutti spostati a sinistra.

Ditemi se sono stato chiaro.

Codice:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "ProvaRotazione_main.h"
#include <math.h>
#include <stdlib.h>

#define min(a, b)   (((a) < (b)) ? (a) : (b))
#define max(a, b)   (((a) > (b)) ? (a) : (b))
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

int   x1,y1,x2,y2;
int   angolo,larghezza,altezza;
int   X1R,Y1R,X2R,Y2R,X3R,Y3R,X4R,Y4R;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
   : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void TForm1::RuotaPunti(int SrcBitmapWidth,int SrcBitmapHeight,int angle)
{
float radians=(2*3.1416*angle)/360;

float cosine=(float)cos(radians);
float sine=(float)sin(radians);

float Point1x=(-SrcBitmapHeight*sine);
float Point1y=(SrcBitmapHeight*cosine);
float Point2x=(SrcBitmapWidth*cosine-SrcBitmapHeight*sine);
float Point2y=(SrcBitmapHeight*cosine+SrcBitmapWidth*sine);
float Point3x=(SrcBitmapWidth*cosine);
float Point3y=(SrcBitmapWidth*sine);

float minx=min(0,min(Point1x,min(Point2x,Point3x)));
float miny=min(0,min(Point1y,min(Point2y,Point3y)));
float maxx=max(Point1x,max(Point2x,Point3x));
float maxy=max(Point1y,max(Point2y,Point3y));

int DestBitmapWidth=(int)ceil(fabs(maxx)-minx);
int DestBitmapHeight=(int)ceil(fabs(maxy)-miny);

for(int x=0;x<DestBitmapWidth;x++)
{
  for(int y=0;y<DestBitmapHeight;y++)
  {
    int SrcBitmapx=(int)((x+minx)*cosine+(y+miny)*sine);
    int SrcBitmapy=(int)((y+miny)*cosine-(x+minx)*sine);
    if (SrcBitmapx==0 && SrcBitmapy==0)
    {
      X1R=x; Y1R=y;
    }
    if (SrcBitmapx>=SrcBitmapWidth-1 && SrcBitmapy==0)
    {
      X2R=x; Y2R=y;
    }
    if (SrcBitmapx>=SrcBitmapWidth-1 && SrcBitmapy>=SrcBitmapHeight-1)
    {
      X3R=x; Y3R=y;
    }
    if (SrcBitmapx==0 && SrcBitmapy>=SrcBitmapHeight-1)
    {
      X4R=x; Y4R=y;
    }
  }
}
}
//---------------------------------------------------------------------------
void TForm1::RettangoloXorRotazione(int x1,int y1,int x2,int y2,
                                       int x3,int y3,int x4,int y4)
{
TPoint   points[5];

   points[0]=Point(x1,y1);
   points[1]=Point(x2,y2);
   points[2]=Point(x3,y3);
   points[3]=Point(x4,y4);
   points[4]=Point(x1,y1);
   ImageFoglio->Canvas->Brush->Color=clBlack;
   ImageFoglio->Canvas->Pen->Color=clGray;
   ImageFoglio->Canvas->Pen->Mode=pmCopy;
   ImageFoglio->Canvas->Polyline(points,4);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonDisegnaElllisseClick(TObject *Sender)
{
   x1=atoi(Edit_x1->Text.c_str());
   y1=atoi(Edit_y1->Text.c_str());
   x2=atoi(Edit_x2->Text.c_str());
   y2=atoi(Edit_y2->Text.c_str());
   ImageFoglio->Canvas->Pen->Color=clBlack;
   ImageFoglio->Canvas->Ellipse(x1,y1,x2,y2);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonRuotaBitmapClick(TObject *Sender)
{
   larghezza=x2-x1;
   altezza=y2-y1;
   angolo=atoi(EditAngoloRotazione->Text.c_str());

   RuotaPunti(larghezza,altezza,angolo);

   RettangoloXorRotazione(X1R,Y1R,X2R,Y2R,X3R,Y3R,X4R,Y4R);
}
//---------------------------------------------------------------------------
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a:  

Copyright © 2017 Edizioni Master SpA. p.iva : 02105820787

Tutti i diritti di proprietà letteraria e artistica riservati. - Privacy



powered by Simple Machines