| (1) | _____ |
A 2D point in Homogeneous coordinates has how many elements? |
|
||
| (2) | _____ |
A 2D rotation matrix in Cartesian coordinates has how many elements? |
|
\(\bs{T} = \left[ \begin{array}{r r} 0 & -1 \\ 1 & 0\end{array}\right] \)
\(\bs{S} = \left[ \begin{array}{r r r r} 0 & 1 & 1 & 0 \\ 0 & 0 & 1 & 1\end{array}\right] \)
\( \bs{R} = \left[ \begin{array}{r r} \cos \theta & -\sin \theta \\ \sin \theta & \cos \theta \end{array}\right] \)
and
\( \bs{S} = \left[ \begin{array}{r r} \alpha & 0 \\ 0 & \beta \end{array}\right] \)drawLine() method in the
Rasterizer2D class (that uses the classes/structs
from the programming assignments):
void Rasterizer2D::drawLine(const Matrix<2,1>& p, const Matrix<2,1>& q,
const Color& color)
{
double alpha, m;
if (q.get(0,0) == p.get(0,0))
m = INFINITY;
else
m = (q.get(1,0)-p.get(1,0))/(q.get(0,0)-p.get(0,0));
if ((m >= -1.0) && (m <= 1.0))
{
double y;
int xEnd, xStart;
if (p.get(0,0) <= q.get(0,0))
{
xStart = (int)round(p.get(0,0));
xEnd = (int)round(q.get(0,0));
}
else
{
xStart = (int)round(q.get(0,0));
xEnd = (int)round(p.get(0,0));
}
for (int x=xStart; x<=xEnd; x++)
{
if (q.get(0,0) == p.get(0,0))
{
y = p.get(1,0);
}
else
{
alpha = (x - p.get(0,0))/(q.get(0,0) - p.get(0,0));
y = p.get(1,0) + alpha * (q.get(1,0) - p.get(1,0));
}
fb->setPixel(x, (int)round(y), color);
}
}
else
{
double x;
int yEnd, yStart;
if (p.get(1,0) <= q.get(1,0))
{
yStart = (int)round(p.get(1,0));
yEnd = (int)round(q.get(1,0));
}
else
{
yStart = (int)round(q.get(1,0));
yEnd = (int)round(p.get(1,0));
}
for (int y=yStart; y<=yEnd; y++)
{
if (q.get(1,0) == p.get(1,0))
{
x = p.get(0,0);
}
else
{
alpha = (y - p.get(1,0))/(q.get(1,0) - p.get(1,0));
x = p.get(0,0) + alpha * (q.get(0,0) - p.get(0,0));
}
fb->setPixel((int)round(x), y, color);
}
}
}
show (in the grid below) what will be drawn if this method is called as follows:
Color red = {255,0,0};
Matrix<2,1> p = { 0, 0};
Matrix<2,1> q = {10, 3};
rasterizer->drawLine(red, p, q);
You must assume that the lower-left pixel is the origin [i.e., (0,0)] and that the coordinates increase from left-to-right and bottom-to-top.
onLine() that is passed
a double containing the slope of the line,
a double containing the vertical intercept of the
line, and a Matrix<2,1> containing
a point. This function must return true
of the point is on the line and false otherwise.
sameSide() that is passed
two points defining a line and two test points. The method must
return true if the two points are on the same side
of the line and false otherwise.
sameSide() function above, write a function that
determines if a given point is inside a convex polygon.
Copyright 2014