void Geser(Triangle *T, int deltaX, int deltaY) /* I.S. T terdefinisi */ /* F.S. T digeser, setiap absisnya sebesar deltaX dan setiap ordinatnya sebesar deltaY */ { (*T).P1 = MakePOINT(GetAbsis(GetPointN((*T),0)) + deltaX, GetOrdinat(GetPointN((*T),0)) + deltaY); (*T).P2 = MakePOINT(GetAbsis(GetPointN((*T),1)) + deltaX, GetOrdinat(GetPointN((*T),1)) + deltaY); (*T).P3 = MakePOINT(GetAbsis(GetPointN((*T),2)) + deltaX, GetOrdinat(GetPointN((*T),2)) + deltaY); }
void SetPointN(Triangle *T, Point newP, int N) /* Mengubah nilai komponen Point ke-N dari T */ { switch(N){ case 0: (*T).P1 = MakePOINT(GetAbsis(newP), GetOrdinat(newP)); break; case 1: (*T).P2 = MakePOINT(GetAbsis(newP), GetOrdinat(newP)); break; case 2: (*T).P3 = MakePOINT(GetAbsis(newP), GetOrdinat(newP)); break; } }
Triangle PlusDelta(Triangle T, int deltaX, int deltaY) /* Mengirim salinan T yang absis dari setiap pointnya adalah Absis(P) + deltaX dan * ordinat dari setiap pointnya adalah Ordinat(P) + deltaY */ { Triangle newT; newT.P1 = MakePOINT(GetAbsis(GetPointN(T,0)) + deltaX, GetOrdinat(GetPointN(T,0)) + deltaY); newT.P2 = MakePOINT(GetAbsis(GetPointN(T,1)) + deltaX, GetOrdinat(GetPointN(T,1)) + deltaY); newT.P3 = MakePOINT(GetAbsis(GetPointN(T,2)) + deltaX, GetOrdinat(GetPointN(T,2)) + deltaY); return newT; }
int Kuadran (POINT P) { if ((GetAbsis(P)>0)&&(GetOrdinat(P)>0)) { return 1; } else if ((GetAbsis(P)>0)&&(GetOrdinat(P)<0)) { return 4; } else if ((GetAbsis(P)<0)&&(GetOrdinat(P)>0)) { return 2; } else if ((GetAbsis(P)<0)&&(GetOrdinat(P)<0)) { return 3; } } // Menghasilkan kuadran dari P : 1,2,3, atau 4
void Mirror (POINT *P, boolean SbX, boolean SbY) { if (SbX) { SetOrdinat(*P,-GetOrdinat(*P)); } if (SbY) { SetAbsis(*P,-GetAbsis(*P)); } } // Mencerminkan P yang bergantung pada nilai SbX atau SbY
void Putar (POINT *P, float Sudut) { float Radian,x,y; Radian=(Sudut*phi)/180; /* fungsi cos dan sin membaca dengan sudut radial bukan derajat */ x=GetAbsis(*P); y=GetOrdinat(*P); SetAbsis(*P,cos(Radian)*x - sin(Radian)*y); SetOrdinat(*P,sin(Radian)*x + cos(Radian)*y); } // P diputar sebesar Sudut derajat
POINT MirrorOf (POINT P, boolean SbX, boolean SbY) { POINT Point = P; if (SbX) { SetOrdinat(Point,-GetOrdinat(P)); } if (SbY) { SetAbsis(Point,-GetAbsis(P)); } return Point; } // Menghasilkan salinan P yang dicerminkan tergantung nilai SbX dan SbY
boolean lebihbesar (POINT P1, POINT P2) { return ((GetAbsis(P1))>(GetAbsis(P2))) && ((GetOrdinat(P1))>(GetOrdinat(P2))); } // Mengirimkan true jika P1 > P2
boolean lebihkecil (POINT P1, POINT P2) { return ((GetAbsis(P1))<(GetAbsis(P2))) && ((GetOrdinat(P1))<(GetOrdinat(P2))); } // Mengirimkan true jika P1 < P2
boolean NEQ (POINT P1, POINT P2){ return ((GetAbsis(P1))!=(GetAbsis(P2))) || ((GetOrdinat(P1))!=(GetOrdinat(P2))); } // Mengirimkan true jika P1 != P2
POINT NextY (POINT P) { return MakePOINT(GetAbsis(P),GetOrdinat(P)+1); } // Ordinat ditambah 1
/* KELOMPOK OPERASI ARITMATIKA TERHADAP TYPE */ POINT plus (POINT P1, POINT P2) { POINT P; SetAbsis(P,GetAbsis(P1)+GetAbsis(P2)); SetOrdinat(P,GetOrdinat(P1)+GetOrdinat(P2)); return P; } // Menghasilkan POINT yang bernilai P1+P2 dengan operasi penjumlahan vector
void TulisPOINT (POINT P) { printf("(%.2f,%.2f)\n",GetAbsis(P),GetOrdinat(P)); } // Menulis P dengan format "(X,Y)"
float Panjang (POINT P1, POINT P2) { return sqrt((GetAbsis(P1)-GetAbsis(P2))*(GetAbsis(P1)-GetAbsis(P2))+(GetOrdinat(P1)-GetOrdinat(P2))*(GetOrdinat(P1)-GetOrdinat(P2))); } // Menghitung panjang garis yang dibentuk P1 dan P2
float Jarak0 (POINT P) { return sqrt((GetAbsis(P))*(GetAbsis(P))+(GetOrdinat(P))*(GetOrdinat(P))); } // Menghitung jarak P ke (0,0)
/* KELOMPOK MENENTUKAN DI MANA P BERADA */ boolean IsOrigin (POINT P) { return (GetAbsis(P)==0)&&(GetOrdinat(P)==0); }
boolean IsOnSbX (POINT P) { return (GetOrdinat(P)==0); }
POINT minus (POINT P1, POINT P2) { POINT P; SetAbsis(P,GetAbsis(P1)-GetAbsis(P2)); SetOrdinat(P,GetOrdinat(P1)-GetOrdinat(P2)); return P; } // Menghasilkan POINT yang bernilai P1-P2 dengan spesifikasi pengurangan dua buah POINT
/* KELOMPOK OPERASI LAIN TERHADAP TYPE */ POINT NextX (POINT P) { return MakePOINT(GetAbsis(P)+1,GetOrdinat(P)); } // Absis ditambah 1
float dot (POINT P1, POINT P2) { return GetAbsis(P1)*GetAbsis(P2) + GetOrdinat(P1)*GetOrdinat(P2); } // Operasi perkalian P1.P2 : melakukan operasi dot product; P1.P2=[x1,y2].[x2,y2]
POINT PlusDelta (POINT P, float deltaX, float deltaY) { return MakePOINT(GetAbsis(P)+deltaX,GetOrdinat(P)+deltaY); } // P=[Absis(P)+deltaX,Ordinat(P)+deltaY]
float cross (POINT P1, POINT P2) { return GetAbsis(P1)*GetOrdinat(P2) - GetOrdinat(P1)*GetAbsis(P2); } // Operasi perkalian P1xP2 : melakukan operasi cross product; P1xP2=[x1,y1]T x [x2,y2]T
void setPoint(Plane *plane, Point point, int position) { SetAbsis(&((*plane).points.at(position)), GetAbsis(point)); SetOrdinat(&((*plane).points.at(position)), GetOrdinat(point)); }
/* KELOMPOK OPERASI RELASIONAL TERHADAP POINT */ boolean EQ (POINT P1, POINT P2) { return ((GetAbsis(P1))==(GetAbsis(P2))) && ((GetOrdinat(P1))==(GetOrdinat(P2))); } // Mengirimkan true jika P1 = P2