package mods.custom_flags.client.gui.controls.canvus_tools;
import mods.custom_flags.utils.ImageData;
import net.minecraft.util.ResourceLocation;
/**
* User: nerd-boy
* Date: 12/08/13
* Time: 12:04 PM
* TODO: Add discription
*/
public class CircleTool extends RectangleTool {
@Override
public String getToolName() {
return "tool.circle";
}
private void plotPoint(int x, int y, int[] pixels, int rgb){
if (x > -1 && x < ImageData.IMAGE_RES && y > -1 && y < ImageData.IMAGE_RES){
pixels[x+ImageData.IMAGE_RES*y] = rgb;
}
}
//@Override
protected void drawShape2(int minX, int minY, int maxX, int maxY, int[] pixels, int rgb) {
//Formula = (x-h)^2/a^2 +(y-k)^2/b^2 = 1
float x_mid = (maxX + minX) / 2F;
float y_mid = (maxY + minY) / 2F;
float x_rad = (maxX - minX) / 2F;
float y_rad = (maxY - minY) / 2F;
float x_rad_sq = x_rad * x_rad;
float y_rad_sq = y_rad * y_rad;
for(float time = 0; time < Math.PI/2; time += 0.05F){
plotPoint((int)Math.round((x_mid + x_rad * Math.cos(time))), (int)Math.round(y_mid + y_rad * Math.sin(time)), pixels, rgb);
plotPoint((int)Math.round((x_mid - x_rad * Math.cos(time))), (int)Math.round(y_mid + y_rad * Math.sin(time)), pixels, rgb);
plotPoint((int)Math.round((x_mid + x_rad * Math.cos(time))), (int)Math.round(y_mid - y_rad * Math.sin(time)), pixels, rgb);
plotPoint((int)Math.round((x_mid - x_rad * Math.cos(time))), (int)Math.round(y_mid - y_rad * Math.sin(time)), pixels, rgb);
}
}
@Override
protected void drawShape(int minX, int minY, int maxX, int maxY, int[] pixels, int rgb) {
float x_mid = (maxX + minX) / 2F;
float y_mid = (maxY + minY) / 2F;
float x_rad = (maxX - minX) / 2F;
float y_rad = (maxY - minY) / 2F;
float x_r_sq = x_rad * x_rad;
float y_r_sq = y_rad * y_rad;
int last_x = 0;
float last_y = y_rad;
for(int x = 1; x <= x_rad; x++){
float y = (float) (y_rad * Math.sqrt(x_r_sq - (x * x)) / x_rad);
drawLine((int)Math.ceil(x_mid+last_x), (int)Math.ceil(x_mid+x), (int)Math.ceil(y_mid+last_y), (int)Math.ceil(y_mid+y), pixels, rgb);
drawLine((int)Math.floor(x_mid-last_x), (int)Math.floor(x_mid-x), (int)Math.ceil(y_mid+last_y), (int)Math.ceil(y_mid+y), pixels, rgb);
drawLine((int)Math.ceil(x_mid+last_x), (int)Math.ceil(x_mid+x), (int)Math.floor(y_mid-last_y), (int)Math.floor(y_mid-y), pixels, rgb);
drawLine((int)Math.floor(x_mid-last_x), (int)Math.floor(x_mid-x), (int)Math.floor(y_mid-last_y), (int)Math.floor(y_mid-y), pixels, rgb);
last_x = x;
last_y = y;
}
drawLine((int)Math.floor(x_mid-last_x), (int)Math.floor(x_mid-last_x), (int)Math.floor(y_mid-last_y), (int)Math.ceil(y_mid+last_y), pixels, rgb);
drawLine((int)Math.ceil(x_mid+last_x), (int)Math.ceil(x_mid+last_x), (int)Math.floor(y_mid-last_y), (int)Math.ceil(y_mid+last_y), pixels, rgb);
//drawLine(Math.round(x_mid+last_x), Math.round(x_mid+last_x), Math.round(y_mid-last_y), Math.round(y_mid+last_y), pixels, rgb);
}
/*
@Override
protected void drawShape(int minX, int minY, int maxX, int maxY, int[] pixels, int rgb) {
//Formula = (x-h)^2/a^2 +(y-k)^2/b^2 = 1
float x_mid = (maxX + minX) / 2F;
float y_mid = (maxY + minY) / 2F;
float x_rad = (maxX - minX) / 2F;
float y_rad = (maxY - minY) / 2F;
float x_rad_sq = x_rad * x_rad;
float y_rad_sq = y_rad * y_rad;
float y = y_rad;
float errorThreshold = 1F;
for(float x = 0; x <= x_rad/2+1; x++){
float error = (x*x / x_rad_sq) + (y*y / y_rad_sq);
if(error < errorThreshold){
plotPoint(Math.round(x+x_mid),Math.round(y_mid+y), pixels, rgb);
plotPoint(Math.round(x_mid- x),Math.round(y_mid+y), pixels, rgb);
plotPoint(Math.round(x+x_mid),Math.round(y_mid-y), pixels, rgb);
plotPoint(Math.round(x_mid- x),Math.round(y_mid-y), pixels, rgb);
}else{
y--;
plotPoint(Math.round(x+x_mid),Math.round(y_mid+y), pixels, rgb);
plotPoint(Math.round(x_mid- x),Math.round(y_mid+y), pixels, rgb);
plotPoint(Math.round(x+x_mid),Math.round(y_mid-y), pixels, rgb);
plotPoint(Math.round(x_mid- x),Math.round(y_mid-y), pixels, rgb);
}
}
float x=x_rad;
for(y = 0; y <= y_rad/2; y++){
float error = (x*x / x_rad_sq) + (y*y / y_rad_sq);
if(error < errorThreshold){
plotPoint(Math.round(x+x_mid),Math.round(y_mid+y), pixels, rgb);
plotPoint(Math.round(x_mid- x),Math.round(y_mid+y), pixels, rgb);
plotPoint(Math.round(x+x_mid),Math.round(y_mid-y), pixels, rgb);
plotPoint(Math.round(x_mid- x),Math.round(y_mid-y), pixels, rgb);
}else{
x--;
plotPoint(Math.round(x+x_mid),Math.round(y_mid+y), pixels, rgb);
plotPoint(Math.round(x_mid- x),Math.round(y_mid+y), pixels, rgb);
plotPoint(Math.round(x+x_mid),Math.round(y_mid-y), pixels, rgb);
plotPoint(Math.round(x_mid- x),Math.round(y_mid-y), pixels, rgb);
}
}
/*
float x=x_rad;
for(y = 0; y <= y_rad; y++){
plotPoint(Math.round(x+x_mid),Math.round(y_mid+y), pixels, rgb);
plotPoint(Math.round(x_mid- x),Math.round(y_mid+y), pixels, rgb);
plotPoint(Math.round(x+x_mid),Math.round(y_mid-y), pixels, rgb);
plotPoint(Math.round(x_mid- x),Math.round(y_mid-y), pixels, rgb);
float error = Math.abs(x*x / x_rad_sq + y*y / y_rad_sq);
if(error > errorThreshold){
x--;
}
}*/
//}
/*
@Override
protected void drawShape(int minX, int minY, int maxX, int maxY, int[] pixels, int rgb) {
int r_x = (maxX - minX);
int r_y = (maxY - minY);
int mid_x = (maxX + minX);
int mid_y = (maxY + minY);
int rSq_x = r_x * r_x;
int rSq_y = r_y * r_y;
int x = 0;
int y = r_y;
int p_x = 0;
int p_y = 2 * rSq_x * y;
plotPoint(Math.round((mid_x+x)/2F), Math.round((mid_y+y)/2F), pixels, rgb);
plotPoint(Math.round((mid_x-x)/2F), Math.round((mid_y+y)/2F), pixels, rgb);
plotPoint(Math.round((mid_x-x)/2F), Math.round((mid_y-y)/2F), pixels, rgb);
plotPoint(Math.round((mid_x+x)/2F), Math.round((mid_y-y)/2F), pixels, rgb);
float p = (rSq_y - (rSq_x * r_y) + 0.25F*rSq_x);
while(p_x < p_y){
x ++;
p_x=p_x+2*rSq_y;
if(p < 0){
p = p +rSq_y+p_x;
}else{
y--;
p_y=p_y-2*rSq_x;
p = p +rSq_y + p_x-p_y;
}
plotPoint(Math.round((mid_x+x)/2F), Math.round((mid_y+y)/2F), pixels, rgb);
plotPoint(Math.round((mid_x-x)/2F), Math.round((mid_y+y)/2F), pixels, rgb);
plotPoint(Math.round((mid_x-x)/2F), Math.round((mid_y-y)/2F), pixels, rgb);
plotPoint(Math.round((mid_x+x)/2F), Math.round((mid_y-y)/2F), pixels, rgb);
}
}
/*
int hh = height * height;
int ww = width * width;
int hhww = hh * ww;
int x0 = width;
int dx = 0;
// do the horizontal diameter
for (int x = -width; x <= width; x++)
setpixel(origin.x + x, origin.y);
// now do both halves at the same time, away from the diameter
for (int y = 1; y <= height; y++)
{
int x1 = x0 - (dx - 1); // try slopes of dx - 1 or more
for ( ; x1 > 0; x1--)
if (x1*x1*hh + y*y*ww <= hhww)
break;
dx = x0 - x1; // current approximation of the slope
x0 = x1;
for (int x = -x0; x <= x0; x++)
{
setpixel(origin.x + x, origin.y - y);
setpixel(origin.x + x, origin.y + y);
}
}
*/
/*
void DrawEllipse (int x0, int y0, int width, int height)
{
int a2 = width * width;
int b2 = height * height;
int fa2 = 4 * a2, fb2 = 4 * b2;
int x0, y0, x, y, sigma;
first half
for (x = 0, y = height, sigma = 2*b2+a2*(1-2*height); b2*x <= a2*y; x++)
{
DrawPixel (x0 + x, y0 + y);
DrawPixel (x0 - x, y0 + y);
DrawPixel (x0 + x, y0 - y);
DrawPixel (x0 - x, y0 - y);
if (sigma >= 0)
{
sigma += fa2 * (1 - y);
y--;
}
sigma += b2 * ((4 * x) + 6);
}
second half
for (x = width, y = 0, sigma = 2*a2+b2*(1-2*width); a2*y <= b2*x; y++)
{
DrawPixel (x0 + x, y0 + y);
DrawPixel (x0 - x, y0 + y);
DrawPixel (x0 + x, y0 - y);
DrawPixel (x0 - x, y0 - y);
if (sigma >= 0)
{
sigma += fb2 * (1 - x);
x--;
}
sigma += a2 * ((4 * y) + 6);
}
}
*/
/*
@Override
protected void drawShape(int minX, int minY, int maxX, int maxY, int[] pixels, int rgb) {
int width = (maxX - minX) / 2;
int height = (maxY - minY)/ 2;
int midX = (maxX + minX) / 2;
int midY = (maxY + minY)/ 2;
int h_2 = height * height;
int w_2 = width * width;
int prevSR = 0;
for(int i = 1; i <= 2 * width; i++){
int sqrRoot = (int) Math.sqrt(h_2 - (((h_2 * (width - i)) * (width - i)) / w_2));
drawLine(minX + i-1, minX + i, minY + height+prevSR, minY + height+sqrRoot, pixels, rgb);
drawLine(minX + i-1, minX + i, minY + height-prevSR, minY + height-sqrRoot, pixels, rgb);
prevSR = sqrRoot;
}
}
*/
private void drawLine(int x0, int x1, int y0, int y1, int[] pixelsCurrent, int rgb) {
int dx = Math.abs(x1 - x0);
int dy = Math.abs(y1 - y0);
int sx = x0<x1 ? 1 : -1;
int sy = y0<y1 ? 1 : -1;
int err = dx - dy;
boolean done = false;
while(!done){
if (x0 > -1 && x0 < ImageData.IMAGE_RES && y0 > -1 && y0 < ImageData.IMAGE_RES){
pixelsCurrent[x0+ImageData.IMAGE_RES*y0] = rgb;
}
if(x0 == x1 && y0 == y1){
done = true;
}
int e2 = 2*err;
if(e2 > -dy && !done){
err = err - dy;
x0 = x0 + sx;
}
if(x0 == x1 && y0 == y1 && !done){
if (x0 > -1 && x0 < ImageData.IMAGE_RES && y0 > -1 && y0 < ImageData.IMAGE_RES){
pixelsCurrent[x0+ImageData.IMAGE_RES*y0] = rgb;
}
done = true;
}
if(e2 < dx && !done){
err = err + dx;
y0 = y0 + sy;
}
}
}
}