109 lines
3.3 KiB
C
109 lines
3.3 KiB
C
public class Line
|
|
{
|
|
private double x0, y0, x1, y1;
|
|
private Color foreColor;
|
|
private byte lineStyleMask;
|
|
private int thickness;
|
|
private float globalm;
|
|
|
|
public Line(double x0, double y0, double x1, double y1, Color color, byte lineStyleMask, int thickness)
|
|
{
|
|
this.x0 = x0;
|
|
this.y0 = y0;
|
|
this.y1 = y1;
|
|
this.x1 = x1;
|
|
|
|
this.foreColor = color;
|
|
|
|
this.lineStyleMask = lineStyleMask;
|
|
|
|
this.thickness = thickness;
|
|
|
|
}
|
|
|
|
private void plot(Bitmap bitmap, double x, double y, double c)
|
|
{
|
|
int alpha = (int)(c * 255);
|
|
if (alpha > 255) alpha = 255;
|
|
if (alpha < 0) alpha = 0;
|
|
Color color = Color.FromArgb(alpha, foreColor);
|
|
if (BitmapDrawHelper.checkIfInside((int)x, (int)y, bitmap))
|
|
{
|
|
bitmap.SetPixel((int)x, (int)y, color);
|
|
}
|
|
}
|
|
|
|
int ipart(double x) { return (int)x;}
|
|
|
|
int round(double x) {return ipart(x+0.5);}
|
|
|
|
double fpart(double x) {
|
|
if(x<0) return (1-(x-Math.Floor(x)));
|
|
return (x-Math.Floor(x));
|
|
}
|
|
|
|
double rfpart(double x) {
|
|
return 1-fpart(x);
|
|
}
|
|
|
|
|
|
public void draw(Bitmap bitmap) {
|
|
bool steep = Math.Abs(y1-y0)>Math.Abs(x1-x0);
|
|
double temp;
|
|
if(steep){
|
|
temp=x0; x0=y0; y0=temp;
|
|
temp=x1;x1=y1;y1=temp;
|
|
}
|
|
if(x0>x1){
|
|
temp = x0;x0=x1;x1=temp;
|
|
temp = y0;y0=y1;y1=temp;
|
|
}
|
|
|
|
double dx = x1-x0;
|
|
double dy = y1-y0;
|
|
double gradient = dy/dx;
|
|
|
|
double xEnd = round(x0);
|
|
double yEnd = y0+gradient*(xEnd-x0);
|
|
double xGap = rfpart(x0+0.5);
|
|
double xPixel1 = xEnd;
|
|
double yPixel1 = ipart(yEnd);
|
|
|
|
if(steep){
|
|
plot(bitmap, yPixel1, xPixel1, rfpart(yEnd)*xGap);
|
|
plot(bitmap, yPixel1+1, xPixel1, fpart(yEnd)*xGap);
|
|
}else{
|
|
plot(bitmap, xPixel1,yPixel1, rfpart(yEnd)*xGap);
|
|
plot(bitmap, xPixel1, yPixel1+1, fpart(yEnd)*xGap);
|
|
}
|
|
double intery = yEnd+gradient;
|
|
|
|
xEnd = round(x1);
|
|
yEnd = y1+gradient*(xEnd-x1);
|
|
xGap = fpart(x1+0.5);
|
|
double xPixel2 = xEnd;
|
|
double yPixel2 = ipart(yEnd);
|
|
if(steep){
|
|
plot(bitmap, yPixel2, xPixel2, rfpart(yEnd)*xGap);
|
|
plot(bitmap, yPixel2+1, xPixel2, fpart(yEnd)*xGap);
|
|
}else{
|
|
plot(bitmap, xPixel2, yPixel2, rfpart(yEnd)*xGap);
|
|
plot(bitmap, xPixel2, yPixel2+1, fpart(yEnd)*xGap);
|
|
}
|
|
|
|
if(steep){
|
|
for(int x=(int)(xPixel1+1);x<=xPixel2-1;x++){
|
|
plot(bitmap, ipart(intery), x, rfpart(intery));
|
|
plot(bitmap, ipart(intery)+1, x, fpart(intery));
|
|
intery+=gradient;
|
|
}
|
|
}else{
|
|
for(int x=(int)(xPixel1+1);x<=xPixel2-1;x++){
|
|
plot(bitmap, x,ipart(intery), rfpart(intery));
|
|
plot(bitmap, x, ipart(intery)+1, fpart(intery));
|
|
intery+=gradient;
|
|
}
|
|
}
|
|
}
|
|
}
|