#include <stdio.h>
#define SCREEN_HEIGHT 22
#define SCREEN_WIDTH 78
// Simulated frame buffer
char Screen[SCREEN_HEIGHT][SCREEN_WIDTH];
void SetPixel(int x, int y, char color)
{
if ((x < 0) || (x >= SCREEN_WIDTH) ||
(y < 0) || (y >= SCREEN_HEIGHT))
return;
Screen[y][x] = color;
}
void Visualize(void)
{
int x, y;
for (y = 0; y < SCREEN_HEIGHT; y++)
{
for (x = 0; x < SCREEN_WIDTH; x++)
}
}
typedef struct
{
int x, y;
} Point2D;
int main(void)
{
// triangle vertices
Point2D vx0 = { SCREEN_WIDTH / 2, SCREEN_HEIGHT / 7 };
Point2D vx1 = { SCREEN_WIDTH * 6 / 7, SCREEN_HEIGHT * 2 / 3 };
Point2D vx2 = { SCREEN_WIDTH / 7, SCREEN_HEIGHT * 6 / 7 };
// vectors lying on triangle sides
Point2D v0, v1, v2;
// current point coordinates
int x, y;
// calculate side vectors
v0.x = vx1.x - vx0.x;
v0.y = vx1.y - vx0.y;
v1.x = vx2.x - vx1.x;
v1.y = vx2.y - vx1.y;
v2.x = vx0.x - vx2.x;
v2.y = vx0.y - vx2.y;
// process all points
for (y = 0; y < SCREEN_HEIGHT; y++)
for (x = 0; x < SCREEN_WIDTH; x++)
{
int z1 = (x - vx0.x) * v0.y - (y - vx0.y) * v0.x;
int z2 = (x - vx1.x) * v1.y - (y - vx1.y) * v1.x;
int z3 = (x - vx2.x) * v2.y - (y - vx2.y) * v2.x;
if ((z1 * z2 > 0) && (z1 * z3 > 0))
SetPixel(x, y, '+'); // point is to the right (left) of all vectors
else
SetPixel(x, y, '-');
}
// draw triangle vertices
SetPixel(vx0.x, vx0.y, '0');
SetPixel(vx1.x, vx1.y, '1');
SetPixel(vx2.x, vx2.y, '2');
// visualize the result
Visualize();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgojZGVmaW5lIFNDUkVFTl9IRUlHSFQgMjIKI2RlZmluZSBTQ1JFRU5fV0lEVEggIDc4CgovLyBTaW11bGF0ZWQgZnJhbWUgYnVmZmVyCmNoYXIgU2NyZWVuW1NDUkVFTl9IRUlHSFRdW1NDUkVFTl9XSURUSF07Cgp2b2lkIFNldFBpeGVsKGludCB4LCBpbnQgeSwgY2hhciBjb2xvcikKewogIGlmICgoeCA8IDApIHx8ICh4ID49IFNDUkVFTl9XSURUSCkgfHwKICAgICAgKHkgPCAwKSB8fCAoeSA+PSBTQ1JFRU5fSEVJR0hUKSkKICAgIHJldHVybjsKCiAgU2NyZWVuW3ldW3hdID0gY29sb3I7Cn0KCnZvaWQgVmlzdWFsaXplKHZvaWQpCnsKICBpbnQgeCwgeTsKCiAgZm9yICh5ID0gMDsgeSA8IFNDUkVFTl9IRUlHSFQ7IHkrKykKICB7CiAgICBmb3IgKHggPSAwOyB4IDwgU0NSRUVOX1dJRFRIOyB4KyspCiAgICAgIHByaW50ZigiJWMiLCBTY3JlZW5beV1beF0pOwoKICAgIHByaW50ZigiXG4iKTsKICB9Cn0KCnR5cGVkZWYgc3RydWN0CnsKICBpbnQgeCwgeTsKfSBQb2ludDJEOwoKaW50IG1haW4odm9pZCkKewogIC8vIHRyaWFuZ2xlIHZlcnRpY2VzCiAgUG9pbnQyRCB2eDAgPSB7IFNDUkVFTl9XSURUSCAvIDIsIFNDUkVFTl9IRUlHSFQgLyA3IH07CiAgUG9pbnQyRCB2eDEgPSB7IFNDUkVFTl9XSURUSCAqIDYgLyA3LCBTQ1JFRU5fSEVJR0hUICogMiAvIDMgfTsKICBQb2ludDJEIHZ4MiA9IHsgU0NSRUVOX1dJRFRIIC8gNywgU0NSRUVOX0hFSUdIVCAqIDYgLyA3IH07CiAgLy8gdmVjdG9ycyBseWluZyBvbiB0cmlhbmdsZSBzaWRlcwogIFBvaW50MkQgdjAsIHYxLCB2MjsKICAvLyBjdXJyZW50IHBvaW50IGNvb3JkaW5hdGVzCiAgaW50IHgsIHk7CgogIC8vIGNhbGN1bGF0ZSBzaWRlIHZlY3RvcnMKCiAgdjAueCA9IHZ4MS54IC0gdngwLng7CiAgdjAueSA9IHZ4MS55IC0gdngwLnk7CgogIHYxLnggPSB2eDIueCAtIHZ4MS54OwogIHYxLnkgPSB2eDIueSAtIHZ4MS55OwoKICB2Mi54ID0gdngwLnggLSB2eDIueDsKICB2Mi55ID0gdngwLnkgLSB2eDIueTsKCiAgLy8gcHJvY2VzcyBhbGwgcG9pbnRzCgogIGZvciAoeSA9IDA7IHkgPCBTQ1JFRU5fSEVJR0hUOyB5KyspCiAgICBmb3IgKHggPSAwOyB4IDwgU0NSRUVOX1dJRFRIOyB4KyspCiAgICB7CiAgICAgIGludCB6MSA9ICh4IC0gdngwLngpICogdjAueSAtICh5IC0gdngwLnkpICogdjAueDsKICAgICAgaW50IHoyID0gKHggLSB2eDEueCkgKiB2MS55IC0gKHkgLSB2eDEueSkgKiB2MS54OwogICAgICBpbnQgejMgPSAoeCAtIHZ4Mi54KSAqIHYyLnkgLSAoeSAtIHZ4Mi55KSAqIHYyLng7CgogICAgICBpZiAoKHoxICogejIgPiAwKSAmJiAoejEgKiB6MyA+IDApKQogICAgICAgIFNldFBpeGVsKHgsIHksICcrJyk7IC8vIHBvaW50IGlzIHRvIHRoZSByaWdodCAobGVmdCkgb2YgYWxsIHZlY3RvcnMKICAgICAgZWxzZQogICAgICAgIFNldFBpeGVsKHgsIHksICctJyk7CiAgICB9CgogIC8vIGRyYXcgdHJpYW5nbGUgdmVydGljZXMKCiAgU2V0UGl4ZWwodngwLngsIHZ4MC55LCAnMCcpOwogIFNldFBpeGVsKHZ4MS54LCB2eDEueSwgJzEnKTsKICBTZXRQaXhlbCh2eDIueCwgdngyLnksICcyJyk7CgogIC8vIHZpc3VhbGl6ZSB0aGUgcmVzdWx0CgogIFZpc3VhbGl6ZSgpOwoKICByZXR1cm4gMDsKfQo=