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
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); } |
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Cucy« (08.12.2015, 21:32)
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.
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 ); |
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.
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.
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Cucy« (14.12.2015, 17:34)
Werbeanzeige