draw() method:
public void draw(Color color, double[] p, double[] q)
{
double alpha, m;
if (q[0] == p[0]) m = Double.POSITIVE_INFINITY;
else m = (q[1]-p[1])/(q[0]-p[0]);
if ((m >= -1.0) && (m <= 1.0))
{
double y;
int xEnd, xStart;
if (p[0] <= q[0])
{
xStart = (int)Math.round(p[0]);
xEnd = (int)Math.round(q[0]);
}
else
{
xStart = (int)Math.round(q[0]);
xEnd = (int)Math.round(p[0]);
}
for (int x=xStart; x<=xEnd; x++)
{
if (q[0] == p[0])
{
y = p[1];
}
else
{
alpha = (x - p[0])/(q[0] - p[0]);
y = p[1] + alpha * (q[1] - p[1]);
}
fb.setPixel(x, (int)Math.round(y), color);
}
}
else
{
double x;
int yEnd, yStart;
if (p[1] <= q[1])
{
yStart = (int)Math.round(p[1]);
yEnd = (int)Math.round(q[1]);
}
else
{
yStart = (int)Math.round(q[1]);
yEnd = (int)Math.round(p[1]);
}
for (int y=yStart; y<=yEnd; y++)
{
if (q[1] == p[1])
{
x = p[0];
}
else
{
alpha = (y - p[1])/(q[1] - p[1]);
x = p[0] + alpha * (q[0] - p[0]);
}
fb.setPixel((int)Math.round(x), y, color);
}
}
}
show (in the grid below) what will be drawn if this method is called as follows:
double[] p = { 0, 0};
double[] q = {10, 3};
draw(Color.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() method. Your
answer must be consistent with the comments describing the method.
You may use methods that were required in the
VMath and MMath classes.
/**
* Determines if a point is on a line
* (represented in in explicit form)
*
* @param m The slope of the line
* @param b The vertical intercept of the line
* @param p The test point
* @return true if p is on the line defined by h
*/
public static boolean onLine(double m, double b, double[] p)
{
}
sameSide() method. Your
answer must be consistent with the comments describing the method.
You may use methods that were required in the
VMath and MMath classes.
/**
* Determines if two 2D points are on the same side of
* a line segement
*
* The vertexes can be assumed to be ordered correctly
* (i.e., obey the right-hand rule)
*
* @param p One point on the line
* @param q Another point on the line
* @param s One test point
* @param t The other test point
* @return true if s and t are on the same side; false otherwise
*/
public static boolean sameSide(double[] p, double[] q,
double[] s, double[] t)
{
}
sameSide() method above, write a method that
determines if a given point is inside a convex polygon.
Copyright 2007