@@ -32,11 +32,21 @@ void Rectangle::getInsidePoints(
3232
3333 int minX = vertices[0 ].first , maxX = vertices[0 ].first ;
3434 int minY = vertices[0 ].second , maxY = vertices[0 ].second ;
35- for (int i = 1 ; i < 4 ; i++) {
36- minX = std::min (minX, vertices[i].first );
37- maxX = std::max (maxX, vertices[i].first );
38- minY = std::min (minY, vertices[i].second );
39- maxY = std::max (maxY, vertices[i].second );
35+
36+ // 1. Setup vertices and pre-compute edge vectors for the cross-product
37+ int vx[4 ], vy[4 ], ex[4 ], ey[4 ];
38+ for (int i = 0 ; i < 4 ; i++) {
39+ vx[i] = vertices[i].first ;
40+ vy[i] = vertices[i].second ;
41+ minX = std::min (minX, vx[i]);
42+ maxX = std::max (maxX, vx[i]);
43+ minY = std::min (minY, vy[i]);
44+ maxY = std::max (maxY, vy[i]);
45+ }
46+
47+ for (int i = 0 ; i < 4 ; i++) {
48+ ex[i] = vertices[(i + 1 ) % 4 ].first - vx[i];
49+ ey[i] = vertices[(i + 1 ) % 4 ].second - vy[i];
4050 }
4151
4252 float u0, v0, uX, vX, uY, vY;
@@ -49,22 +59,31 @@ void Rectangle::getInsidePoints(
4959 float duy = uY - u0;
5060 float dvy = vY - v0;
5161
52- int v0x = vertices[0 ].first , v0y = vertices[0 ].second ;
53- int dx1 = vertices[1 ].first - v0x, dy1 = vertices[1 ].second - v0y;
54- int dx2 = vertices[3 ].first - v0x, dy2 = vertices[3 ].second - v0y;
55- int lenSq1 = dx1 * dx1 + dy1 * dy1;
56- int lenSq2 = dx2 * dx2 + dy2 * dy2;
57-
5862 for (int y = minY; y <= maxY; ++y) {
5963 float rowU = u0 + (y - minY) * duy;
6064 float rowV = v0 + (y - minY) * dvy;
6165
6266 for (int x = minX; x <= maxX; ++x) {
63- int relX = x - v0x, relY = y - v0y;
64- int dot1 = relX * dx1 + relY * dy1;
65- int dot2 = relX * dx2 + relY * dy2;
6667
67- if (dot1 >= 0 && dot1 <= lenSq1 && dot2 >= 0 && dot2 <= lenSq2) {
68+ bool inside = true ;
69+ bool hasPos = false ;
70+ bool hasNeg = false ;
71+
72+ for (int i = 0 ; i < 4 ; ++i) {
73+ int cross = (x - vx[i]) * ey[i] - (y - vy[i]) * ex[i];
74+
75+ if (cross > 0 )
76+ hasPos = true ;
77+ else if (cross < 0 )
78+ hasNeg = true ;
79+
80+ if (hasPos && hasNeg) {
81+ inside = false ;
82+ break ;
83+ }
84+ }
85+
86+ if (inside) {
6887 Color c = texture ? texture->sample ((int )(rowU + 0 .5f ),
6988 (int )(rowV + 0 .5f ))
7089 : color;
0 commit comments