5 Linha::Linha(double x1
,double y1
,double x2
, double y2
) {
12 void Linha::translate(Ponto v
) {
13 vertices
[0] = vertices
[0] + v
;
14 vertices
[1] = vertices
[1] + v
;
17 Rect::Rect(double x1
,double y1
,double x2
, double y2
) {
25 void Rect::normaliza() {
26 double xmin
,xmax
,ymin
,ymax
;
27 xmin
= std::min(vertices
[0].x
,vertices
[1].x
);
28 xmax
= std::max(vertices
[0].x
,vertices
[1].x
);
29 ymin
= std::min(vertices
[0].y
,vertices
[1].y
);
30 ymax
= std::max(vertices
[0].y
,vertices
[1].y
);
37 void Linha::desenha() {
38 glColor3f(color
[0],color
[1],color
[2]);
40 glVertex3f(vertices
[0].x
, vertices
[0].y
, -1.5f
); // origin of the line
41 glVertex3f(vertices
[1].x
, vertices
[1].y
, -1.5f
); // origin of the line
46 void Polygon::desenha() {
47 int n
= linhas
.size();
48 for (int i
= 0; i
< n
; i
++) {
53 void Polygon::translate(Ponto v
) {
54 for (int i
= 0; i
< linhas
.size(); i
++)
55 linhas
[i
].translate(v
);
58 double operator*(const Ponto
&a
, const Ponto
&b
) {
59 return a
.x
* b
.y
- b
.x
* a
.y
;
62 Ponto
operator-(const Ponto
&a
, const Ponto
&b
) {
69 Ponto
operator+(const Ponto
&a
, const Ponto
&b
) {
76 double distance(const Ponto
&a
,const Ponto
&b
) {
77 return sqrt((a
.x
-b
.x
)*(a
.x
-b
.x
)+(a
.y
-b
.y
)*(a
.y
-b
.y
));
80 void drawCircle(double radius
, int lines
)
82 double i2rad
= PI
/(lines
/2.0);
83 glColor3f(1.0,1.0,1.0);
85 for (int i
=0; i
< lines
; i
++) {
86 double degInRad
= i
*i2rad
;
87 glVertex3f(cos(degInRad
)*radius
,sin(degInRad
)*radius
,0);
90 glColor3f(0.0,0.0,0.0);
91 glBegin(GL_LINE_LOOP
);
92 for (int i
=0; i
< lines
; i
++) {
93 double degInRad
= i
*i2rad
;
94 glVertex3f(cos(degInRad
)*radius
,sin(degInRad
)*radius
,0);
100 //calcula se a direcao dos segmentos p0p1 p1p2 é horaria, antihoraria ou se sao colineares
101 double direction(const Ponto
&p0
,const Ponto
&p1
,const Ponto
&p2
) {
102 return (p2
- p0
) * (p1
- p0
);
105 bool onsegment(const Ponto
&pi
,const Ponto
&pj
,const Ponto
&pk
) {
106 if ((std::min(pi
.x
, pj
.x
) <= pk
.x
&& pk
.x
<= std::max(pi
.x
, pj
.x
)) &&
107 (std::min(pi
.y
, pj
.y
) <= pk
.y
&& pk
.y
<= std::max(pi
.y
, pj
.y
)))
113 bool linesIntersect(const Linha a
,const Linha b
) {
114 Ponto p1
= a
.vertices
[0];
115 Ponto p2
= a
.vertices
[1];
116 Ponto p3
= b
.vertices
[0];
117 Ponto p4
= b
.vertices
[1];
118 double d1
= direction(p3
, p4
, p1
);
119 double d2
= direction(p3
, p4
, p2
);
120 double d3
= direction(p1
, p2
, p3
);
121 double d4
= direction(p1
, p2
, p4
);
122 if (((d1
> 0 && d2
< 0) || (d1
< 0 && d2
> 0)) &&
123 ((d3
> 0 && d4
< 0) || (d3
< 0 && d4
> 0)))
125 else if (d1
== 0.0 && onsegment(p3
, p4
, p1
))
127 else if (d2
== 0.0 && onsegment(p3
, p4
, p2
))
129 else if (d3
== 0.0 && onsegment(p1
, p2
, p3
))
131 else if (d4
== 0.0 && onsegment(p1
, p2
, p4
))
137 double timeToIntersection(const Linha a
,const Linha b
) {
138 double x1
= a
.vertices
[0].x
, y1
= a
.vertices
[0].y
,
139 x2
= a
.vertices
[1].x
, y2
= a
.vertices
[1].y
,
140 x3
= b
.vertices
[0].x
, y3
= b
.vertices
[0].y
,
141 x4
= b
.vertices
[1].x
, y4
= b
.vertices
[1].y
;
143 double denominator
= ((y4
- y3
) * (x2
- x1
) - (x4
- x3
)*(y2
- y1
));
144 double numeratorA
= ((x4
- x3
)*(y1
- y3
) - (y4
- y3
)*(x1
- x3
));
145 double numeratorB
= ((x2
- x1
)*(y1
- y3
) - (y2
- y1
)*(x1
- x3
));
147 if (denominator
== 0) {
152 ua
= numeratorA
/ denominator
;
153 ub
= numeratorB
/ denominator
;
157 double abs(double x
) {
163 double sign(double n
) {
172 double closerToZero(double a
, double b
) {