Analitikus (koordináta) geometriai gyorstalpaló Szirmay-Kalos László
Mindent számmal axiómák pont számok sík műveletek megfeleltetés egyenes egyenlet illeszkedik metszi függvény geometria algebra
Pontok, alakzatok megadása Mindent számmal! Koordináta rendszer Koordináták megadása Koordináta rendszerek Descartes Polár Homogén
Koordináta rendszerek Yh 1 y 1 r f w Xh x Descartes Polár Baricentrikus Homogén
Pontfüggvények: Mozgatás Vektor = eltolás: v Iránya és hossza (|v|) van Helyvektor De vektor ≠ pont !!! Vektorműveletek v = v1 + v2 (kommutatív, asszoc) v1 = v - v2 (összeadásnak van inverze) v1 = av (összeadásra disztributív) helyvektor origó v1 v2 v av
Skaláris szorzás Definíció Jelentés Tulajdonságok v1 v2 v1v2 = |v1||v2|cos Jelentés Egyik vektor vetülete a másikra x másik hossza Tulajdonságok Kommutatív v1v2 = v2v1 Összeadással disztributív v3(v2+v1) = v3v2 + v3v1 vv = |v|2 v2 |v1|cos v2 v1 v3 |v1|cos
Vektoriális szorzás Definíció Jelentés Tulajdonságok v1 v2 v2 |v1 v2| = |v1||v2|sin Merőleges, jobbkéz szabály Jelentés Paralelogramma területe, síkjára merőleges (Egyik vektor vetülete a másikra merőleges síkra + 90 fokos forgatás) x másik hossza Tulajdonságok Alternáló v1 v2 = - v2 v1 Összeadással disztributív v3 (v2+v1) = v3 v2 + v3 v1 vv = |v|2 v1 |v1|cos v2 v1 |v1|sin 90 fok v1v2
Descartes koordinátarendszer v = xi + yj Egyértelmű (x = vi, y = vj) Műveletek koordinátákban Összeadás: v1 + v2 = (x1+x2)i + (y1+y2)j Skaláris szorzás: v1 v2 = (x1i + y1 j) (x2i + y2 j) = (x1 x2 + y1y2) Vektoriális szorzás: v1 v2 = (x1i + y1 j + z1k) (x2i + y2 j + z2k) = (y1z2 – y2z1) i + (x2z1 – x1z2) j + (x1y2 – y1x2)k Abszolút érték: |v| = vv = x2 + y2 + z2 y j j x i i origó i j k x1 y1 z1 x2 y2 z2
Vektor és Pont nem ugyanaz! 2D: vektor (x, y) Pont (x, y) 3D: vektor (x, y, z) Pont (x, y, z) Műveletek: Vektor + Vektor = Vektor Pont + Vektor = Pont (eltolás) Vektor – Vektor = Vektor Pont – Pont = Vektor Vektor Vektor = Vektor Vektor Vektor = Skalár Vektor * Skalár = Vektor
Vektor és Pont tényleg nem ugyanaz! 2D: vektor (x, y, 0) Pont (x, y, 1) 3D: vektor (x, y, z, 0) Pont (x, y, z, 1) Műveletek: Vektor + Vektor = Vektor Pont + Vektor = Pont (eltolás) Vektor – Vektor = Vektor Pont – Pont = Vektor Vektor Vektor = Skalár Vektor * Skalár = Vektor
Vektor osztály struct Vector { float x, y, z, w; Vector(float x0, float y0, float z0, float w0 = 0) { x = x0; y = y0; z = z0; w = w0; } Vector operator*(float a) { return Vector(x * a, y * a, z * a, w * a); Vector operator+(Vector& v) { return Vector(x + v.x, y + v.y, z + v.z, w + v.w); Vector operator-(Vector& v) { return Vector(x - v.x, y - v.y, z - v.z, w - v.w); float operator*(Vector& v) { return (x * v.x + y * v.y + z * v.z); Vector operator%(Vector& v) { return Vector(y*v.z-z*v.y, z*v.x - x*v.z, x*v.y-y*v.x); float Length() { return sqrt(x * x + y * y + z * z); } };
SSE (3DNow!) struct Vector { float x, y, z, w; public: //-------------------------------------------- class CVector { float x, y, z, w; public: CVector( ) { x = y = z = w = 0.0; } CVector( float x0, float y0, float z0, float w0 = 1.0 ) { x = x0; y = y0; z = z0; w = w0; } float operator*( const Vector& v ) { return (x * v.x + y * v.y + z * v.z); } CVector operator+( const CVector& v ) { __declspec(align(16)) CVector result; #ifdef SIMD __asm { mov esi, this mov edi, v movups xmm0, [esi] movups xmm1, [edi] addps xmm0, xmm1 movaps result, xmm0 } #else result.x = x + v.x; result.y = y + v.y; result.z = z + v.z; result.w = w + v.w; #endif return result; CVector operator*( float f ) { Vector result( x * f, y * f, z * f ); void operator+=( const CVector& v ) { movups [esi], xmm0 x += v.x; y += v.y; z += v.z; void operator*=( float f ) { x *= f; y *= f; z *= f; } CVector operator-( const CVector& v ) { Vector result; subps xmm0, xmm1 result.x = x - v.x; result.y = y - v.y; result.z = z - v.z; CVector operator/( float f ) { Vector result( x/f, y/f, z/f ); CVector operator%( const CVector& v ){ movaps xmm2, xmm0 movaps xmm3, xmm1 shufps xmm0, xmm0, 0xc9 shufps xmm1, xmm1, 0xd2 mulps xmm0, xmm1 shufps xmm2, xmm2, 0xd2 shufps xmm3, xmm3, 0xc9 mulps xmm2, xmm3 subps xmm0, xmm2 result.x = y * v.z - z * v.y; result.y = z * v.x - x * v.z; result.z = x * v.y - y * v.x; float Length( ) { return (float)sqrt( x * x + y * y + z * z ); } void Normalize( ) { float l = Length( ); if ( l < 0.000001f) { x = 1; y = 0; z = 0; } else { x /= l; y /= l; z /= l; } CVector UnitVector( ) { Vector r = * this; r.Normalize(); return r; float * GetArray() { return &x; } float& X() { return x; } float& Y() { return y; } float& Z() { return z; } friend class Matrix; }; SSE (3DNow!) struct Vector { float x, y, z, w; public: Vector operator+( Vector& v ) { __declspec(align(16)) Vector res; __asm { mov esi, this mov edi, v movups xmm0, [esi] movups xmm1, [edi] addps xmm0, xmm1 movaps res, xmm0 } return res; };
2D egyenes n(r – r0) = 0 nx (x – x0) + ny (y – y0) = 0 n normálvektor v irányvektor n(r – r0) = 0 nx (x – x0) + ny (y – y0) = 0 ax + by + c = 0 (x, y, 1) (a, b, c) = 0 y r0 r x r = r0 + v t, t [-∞,∞] x = x0 + vx t y = y0 + vy t
Sík n(r – r0) = 0 nx (x – x0) + ny (y – y0) + nz (z – z0) = 0 n normálvektor z r0 r y x n(r – r0) = 0 nx (x – x0) + ny (y – y0) + nz (z – z0) = 0 ax + by + cz + d = 0 (x, y, z, 1) (a, b, c, d) = 0