Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Cucy

Frischling

  • »Cucy« ist der Autor dieses Themas
  • Private Nachricht senden

1

08.12.2015, 19:15

atan2 Problem??

Hallo, ich habe ein Problem mit der Funktion atan2.

Und zwar versuche ich die Linien zu verbinden damit alles symmetrisch aussieht. (Am Besten ist es, wenn die Linien am Startpunkt überlappen)

Momentan sieht es so aus:


(Link)


Der Code zur Berechnung:

C-/C++-Quelltext

1
2
3
4
5
        CPoint ptLineStart = pItem->Rect.CenterPoint(); 
        CPoint ptLineEnd = pNextItem->Rect.CenterPoint(); 
        CPoint ptCartesianStart = CPoint(ptLineStart.x - (GetWindowRect().Width() / 2), -(ptLineStart.y + GetWindowRect().Height() / 2)); 
        CPoint ptCartesianEnd = CPoint(ptLineEnd.x - (GetWindowRect().Width() / 2), -(ptLineEnd.y + GetWindowRect().Height() / 2)); 
        DOUBLE dRadian = _GetRadian(ptCartesianStart, ptCartesianEnd);


C-/C++-Quelltext

1
2
3
4
5
6
7
_Check_return_ DOUBLE _GetRadian(_In_ CONST CPoint ptStart, _In_ CONST CPoint ptEnd) 
{ 
    DOUBLE dAngle = D3DXToDegree((atan2(ptEnd.y - ptStart.y, ptEnd.x - ptStart.x) * (-1.0f))); 
    if (dAngle < NULL) 
        dAngle += 360.0f; 
    return D3DXToRadian(dAngle); 
}



Der Wert, der zurückgegeben wird von _GetRadian wird später mit D3DXMatrixRotationZ und den einzelnen Textur-Vertex verrechnet und dann gezeichnet.

Was genau mache ich falsch? Man sieht das die Linien nicht genau übereinander lappen.

Danke schon mal für eure Antworten ;)


Edit: Eventuell ist es keine Frage die sich auf C++ generell bezieht. :?:

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Cucy« (08.12.2015, 21:32)


TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

2

08.12.2015, 19:24

Wird denn um den richtigen Mittelpunkt rotiert? Ausserdem: wenn du willst, das die Linien sich in einem Punkt treffen, dann solltest du einfach die gleichen Vertices benutzen.

Cucy

Frischling

  • »Cucy« ist der Autor dieses Themas
  • Private Nachricht senden

3

08.12.2015, 19:39

Wird denn um den richtigen Mittelpunkt rotiert? Ausserdem: wenn du willst, das die Linien sich in einem Punkt treffen, dann solltest du einfach die gleichen Vertices benutzen.

Der Mittelpunkt, ist jeweils der Startpunkt der Linien.

(Link)


Hier ist es genau zu sehen, von wo aus die Linien gezeichnet werden. Die Linien sind eine kleinere Textur, die gestreckt wird.

Hier der Code zum Zeichnen und rotieren:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
        pt += m_ptOrigin;
    CPoint ptCenter = pTexture->m_ptCenter;
    ptCenter.x  = (LONG)( ptCenter.x * fScaleX );
    ptCenter.y  = (LONG)( ptCenter.y * fScaleY );
    pt -= ptCenter;

    FLOAT _left   = (FLOAT)( pt.x );
    FLOAT _top    = (FLOAT)( pt.y );
    FLOAT _right  = pt.x + ( fScaleX * pTexture->m_size.cx );
    FLOAT _bottom = pt.y + ( fScaleY * pTexture->m_size.cy );
    
    FLOAT cx = _left + ptCenter.x;
    FLOAT cy = _top  + ptCenter.y;
    
    _left -= cx;
    _right -= cx;
    _top -= cy;
    _bottom -= cy;
    
    D3DXVECTOR2 v1, v2, v3, v4;
    D3DXMATRIX  mRot;

    v1.x = _left;   v1.y = _top;
    v2.x = _right;  v2.y = _top;
    v3.x = _left;   v3.y = _bottom; 
    v4.x = _right;  v4.y = _bottom; 

    D3DXMatrixRotationZ( &mRot, fRadian );
    D3DXVec2TransformCoord( &v1, &v1, &mRot );  
    D3DXVec2TransformCoord( &v2, &v2, &mRot );  
    D3DXVec2TransformCoord( &v3, &v3, &mRot );  
    D3DXVec2TransformCoord( &v4, &v4, &mRot );
    texVertex vertex[4];
    vertex[0].vec = D3DXVECTOR3(cx + v1.x - 0.5f, cy + v1.y - 0.5f, 0);
    vertex[0].rhw = 1.0f;
    vertex[0].u = pTexture->m_fuLT;
    vertex[0].v = pTexture->m_fvLT;
    vertex[1].vec = D3DXVECTOR3(cx + v2.x - 0.5f, cy + v2.y - 0.5f, 0);
    vertex[1].rhw = 1.0f;
    vertex[1].u = pTexture->m_fuRT;
    vertex[1].v = pTexture->m_fvRT;
    vertex[2].vec = D3DXVECTOR3(cx + v3.x - 0.5f, cy + v3.y - 0.5f, 0);
    vertex[2].rhw = 1.0f;
    vertex[2].u = pTexture->m_fuLB;
    vertex[2].v = pTexture->m_fvLB;
    vertex[3].vec = D3DXVECTOR3(cx + v4.x - 0.5f, cy + v4.y - 0.5f, 0);
    vertex[3].rhw = 1.0f;
    vertex[3].u = pTexture->m_fuRB;
    vertex[3].v = pTexture->m_fvRB;
    
    m_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSU, 1 );
    m_pd3dDevice->SetSamplerState( 0, D3DSAMP_ADDRESSV, 1 );
    m_pd3dDevice->SetSamplerState ( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
    m_pd3dDevice->SetSamplerState ( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
    
    m_pd3dDevice->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );   
    m_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE,   TRUE );
    
    m_pd3dDevice->SetRenderState( D3DRS_TEXTUREFACTOR, D3DCOLOR_ARGB( dwBlendFactorAlhpa, 0, 0, 0 ) );
    m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,   D3DTOP_SELECTARG1 );
    m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
    m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAOP,   D3DTOP_MODULATE );
    m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
    m_pd3dDevice->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR  );
    
    m_pd3dDevice->SetVertexShader( NULL );
    m_pd3dDevice->SetTexture( 0, pTexture->m_pTexture );
    m_pd3dDevice->SetFVF( D3DFVF_XYZRHW|D3DFVF_TEX1 );
    m_pd3dDevice->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, vertex, sizeof(texVertex));
    m_pd3dDevice->SetTexture( 0, NULL );


Ich zeichne jede Linie einzeln, wie man sieht.

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

4

09.12.2015, 14:42

Die Linien "starten" aber nicht an einem "Punkt". Dann waere ihre Dicke naemlich 0. Sie haben eine gewisse Dicke, d.h. sie starten irgendwo mit einem Kreis oder Quadrat. Und da sieht man ja schon ziemlich genau, z.b. oben am Giebel, das der Mittelpunkt anders sein muesste, damit das rotieren korrekt klappt.

Cucy

Frischling

  • »Cucy« ist der Autor dieses Themas
  • Private Nachricht senden

5

09.12.2015, 18:32

Die Linien "starten" aber nicht an einem "Punkt". Dann waere ihre Dicke naemlich 0. Sie haben eine gewisse Dicke, d.h. sie starten irgendwo mit einem Kreis oder Quadrat. Und da sieht man ja schon ziemlich genau, z.b. oben am Giebel, das der Mittelpunkt anders sein muesste, damit das rotieren korrekt klappt.

Wie genau setze ich das jetzt in der Praxis um? Ich verstehe schon was du meinst, nur nicht was genau dort noch fehlt. :S

TGGC

1x Rätselkönig

Beiträge: 1 799

Beruf: Software Entwickler

  • Private Nachricht senden

6

10.12.2015, 08:42

Du musst sie eben um die Groesse dieses Kreises/Quadrates versetzen, damit sich Startkreis/quadrat einer Linie und Endkreis/quadrat der Linie davor ueberlappen. Das ist doch eigentlich logisch, oder? Es ist das gleiche was du vorher mit Start und Endpunkt versucht hast.

Aber: auf dem kleinen Bild kann man es nicht mit Sicherheit erkennen, aber ich wuerde sagen, die Linien starten mit einem Quadrat und keinem Kreis. Da sollte klar sein, das Quadrate nie genau aufeinander passen koennen, wenn sie nicht in 90 Grad Schritten gedreht werden. Und daher wird dies auch nie perfekt funktionieren koennen. Entweder lebst du also mit dem Fehler oder gehst den Alternativweg, den ich schon skizziert habe.

Cucy

Frischling

  • »Cucy« ist der Autor dieses Themas
  • Private Nachricht senden

7

14.12.2015, 17:06

Du musst sie eben um die Groesse dieses Kreises/Quadrates versetzen, damit sich Startkreis/quadrat einer Linie und Endkreis/quadrat der Linie davor ueberlappen. Das ist doch eigentlich logisch, oder? Es ist das gleiche was du vorher mit Start und Endpunkt versucht hast.

Aber: auf dem kleinen Bild kann man es nicht mit Sicherheit erkennen, aber ich wuerde sagen, die Linien starten mit einem Quadrat und keinem Kreis. Da sollte klar sein, das Quadrate nie genau aufeinander passen koennen, wenn sie nicht in 90 Grad Schritten gedreht werden. Und daher wird dies auch nie perfekt funktionieren koennen. Entweder lebst du also mit dem Fehler oder gehst den Alternativweg, den ich schon skizziert habe.

Ich bekomme es einfach nicht umgesetzt.

Ich habe die Theorie verstanden.


(Link)


So sollte es aussehen, theoretisch. Ein Mittelpunkt um den die Textur rotiert mit dem jeweiligen Winkel.

Jedoch habe ich Probleme dies umzusetzen.

Eigentlich muss es doch an der Art liegen, wie ich es zeichne bzw an D3DXMatrixRotationZ/D3DXVec2TransformCoord.

Kann mir wer einen praktischen Ansatz liefern?

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Cucy« (14.12.2015, 17:34)


8

14.12.2015, 19:44

Sieht aus, als ob Du um eine Ecke des Rechteck rotierst, dabei sollte es der Mittelpunkt der Seite sein. Deshalb ist das auch nicht symmetrisch. (Die ursprünglische Linie sollte in der Mitte des Rechtecks liegen, nicht eine Seite desselben sein).

Seh auch grad nicht wie das zu korrigieren wäre, bzw. ist nach meinem Geschmack zu kompliziert gelöst. Linien-zu-Rechteck-Extrusion lässt sich nämlich ganz ohne Winkel und trigonometrischen Funktionen lösen, sogar in 3D. Wann immer man ein atan/atan2 gefolgt von sin/cos hat, macht man meistens überflüssige (und teurere) Berechnungn. Wie gut bist Du in Vektorgeometrie bewandert ?

Cucy

Frischling

  • »Cucy« ist der Autor dieses Themas
  • Private Nachricht senden

9

15.12.2015, 14:42

Habe das Problem gelöst.

Werbeanzeige