|
Computer Graphics |
Fall 2000
|
Computer Graphics
Homework 01
6 hours
Copyright © 2000 David C. Banks
void
Image::setPixel(double _x, double _y, double _z,
double _r, double _g, double _b)
{
int xiMin, xiMax, yiMin, yiMax; // integer valued locations
double xCenter, yCenter; // (_x, _y) in array coords
double distance; // distance between points
xCenter = (_x - xMin)*(xDim - 1.0)/(xMax - xMin);
yCenter = (_y - yMin)*(yDim - 1.0)/(yMax - yMin);
xiMin = ceil (xCenter - radius);
xiMax = floor(xCenter + radius);
yiMin = ceil (yCenter - radius);
yiMax = floor(yCenter + radius);
// Clamp xiMin to the interval [0, xDim-1], etc.
//
// You implement the clamp() routine.
clamp(xiMin, 0, xDim-1);
clamp(xiMax, 0, xDim-1);
clamp(yiMin, 0, yDim-1);
clamp(yiMax, 0, yDim-1);
double w; // weight from filter
int index; // array index
for (int yi = yiMin; yi <= yiMax; yi++)
{
for (int xi = xiMin; xi <= xiMax; xi++)
{
distance = sqrt((xCenter-xi)*(xCenter-xi) +
(yCenter-yi)*(yCenter-yi) );
w = filter(distance);
index = yi*xDim + xi;
pixel[index].x += w*_x;
pixel[index].y += w*_y;
pixel[index].z += w*_z;
pixel[index].red += w*_r;
pixel[index].green += w*_g;
pixel[index].blue += w*_b;
pixel[index].weight += w;
}
}
}