2016 Update
This commit is contained in:
parent
948b86eafa
commit
dcf5d15da3
7965 changed files with 139854 additions and 31002 deletions
108
Task/Xiaolin-Wus-line-algorithm/C/xiaolin-wus-line-algorithm-3.c
Normal file
108
Task/Xiaolin-Wus-line-algorithm/C/xiaolin-wus-line-algorithm-3.c
Normal file
|
|
@ -0,0 +1,108 @@
|
|||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue