@ -0,0 +1,41 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<classpath> |
||||||
|
<classpathentry kind="src" path="src"/> |
||||||
|
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/> |
||||||
|
<classpathentry kind="lib" path="lib/jinput.jar" sourcepath="lib/lwjgl-source-2.8.4.zip"> |
||||||
|
<attributes> |
||||||
|
<attribute name="org.eclipse.jdt.launching.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY" value="Tortuga-game/lib"/> |
||||||
|
</attributes> |
||||||
|
</classpathentry> |
||||||
|
<classpathentry kind="lib" path="lib/lwjgl_util.jar" sourcepath="lib/lwjgl-source-2.8.4.zip"> |
||||||
|
<attributes> |
||||||
|
<attribute name="org.eclipse.jdt.launching.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY" value="Tortuga-game/lib"/> |
||||||
|
</attributes> |
||||||
|
</classpathentry> |
||||||
|
<classpathentry kind="lib" path="lib/lwjgl.jar" sourcepath="lib/lwjgl-source-2.8.4.zip"> |
||||||
|
<attributes> |
||||||
|
<attribute name="org.eclipse.jdt.launching.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY" value="Tortuga-game/lib"/> |
||||||
|
</attributes> |
||||||
|
</classpathentry> |
||||||
|
<classpathentry kind="lib" path="lib/slick-util.jar" sourcepath="lib/slick-util-src.zip"> |
||||||
|
<attributes> |
||||||
|
<attribute name="org.eclipse.jdt.launching.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY" value="Tortuga-game/lib"/> |
||||||
|
</attributes> |
||||||
|
</classpathentry> |
||||||
|
<classpathentry kind="lib" path="lib/jogg-0.0.7.jar"> |
||||||
|
<attributes> |
||||||
|
<attribute name="org.eclipse.jdt.launching.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY" value="Tortuga-game/lib"/> |
||||||
|
</attributes> |
||||||
|
</classpathentry> |
||||||
|
<classpathentry kind="lib" path="lib/jorbis-0.0.15.jar"> |
||||||
|
<attributes> |
||||||
|
<attribute name="org.eclipse.jdt.launching.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY" value="Tortuga-game/lib"/> |
||||||
|
</attributes> |
||||||
|
</classpathentry> |
||||||
|
<classpathentry kind="lib" path="lib/jdom-2.0.3.jar" sourcepath="lib/jdom-2.0.3-sources.zip"> |
||||||
|
<attributes> |
||||||
|
<attribute name="org.eclipse.jdt.launching.CLASSPATH_ATTR_LIBRARY_PATH_ENTRY" value="Tortuga-game/lib"/> |
||||||
|
</attributes> |
||||||
|
</classpathentry> |
||||||
|
<classpathentry kind="output" path="bin"/> |
||||||
|
</classpath> |
@ -0,0 +1,5 @@ |
|||||||
|
/bin/ |
||||||
|
/target/ |
||||||
|
*.log |
||||||
|
.attach_pid* |
||||||
|
*~ |
@ -0,0 +1,17 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<projectDescription> |
||||||
|
<name>Tortuga-game</name> |
||||||
|
<comment></comment> |
||||||
|
<projects> |
||||||
|
</projects> |
||||||
|
<buildSpec> |
||||||
|
<buildCommand> |
||||||
|
<name>org.eclipse.jdt.core.javabuilder</name> |
||||||
|
<arguments> |
||||||
|
</arguments> |
||||||
|
</buildCommand> |
||||||
|
</buildSpec> |
||||||
|
<natures> |
||||||
|
<nature>org.eclipse.jdt.core.javanature</nature> |
||||||
|
</natures> |
||||||
|
</projectDescription> |
@ -0,0 +1,11 @@ |
|||||||
|
eclipse.preferences.version=1 |
||||||
|
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled |
||||||
|
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 |
||||||
|
org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve |
||||||
|
org.eclipse.jdt.core.compiler.compliance=1.6 |
||||||
|
org.eclipse.jdt.core.compiler.debug.lineNumber=generate |
||||||
|
org.eclipse.jdt.core.compiler.debug.localVariable=generate |
||||||
|
org.eclipse.jdt.core.compiler.debug.sourceFile=generate |
||||||
|
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error |
||||||
|
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error |
||||||
|
org.eclipse.jdt.core.compiler.source=1.6 |
After Width: | Height: | Size: 48 KiB |
After Width: | Height: | Size: 43 KiB |
After Width: | Height: | Size: 1.6 KiB |
After Width: | Height: | Size: 40 KiB |
After Width: | Height: | Size: 30 KiB |
After Width: | Height: | Size: 71 KiB |
After Width: | Height: | Size: 44 KiB |
After Width: | Height: | Size: 6.5 KiB |
After Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 16 KiB |
After Width: | Height: | Size: 17 KiB |
After Width: | Height: | Size: 270 KiB |
After Width: | Height: | Size: 328 KiB |
After Width: | Height: | Size: 283 KiB |
After Width: | Height: | Size: 46 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 36 KiB |
After Width: | Height: | Size: 60 KiB |
After Width: | Height: | Size: 1.0 MiB |
After Width: | Height: | Size: 959 KiB |
After Width: | Height: | Size: 1001 KiB |
After Width: | Height: | Size: 1.1 MiB |
After Width: | Height: | Size: 1.0 MiB |
After Width: | Height: | Size: 1.0 MiB |
After Width: | Height: | Size: 950 KiB |
After Width: | Height: | Size: 190 KiB |
After Width: | Height: | Size: 951 KiB |
After Width: | Height: | Size: 8.8 KiB |
After Width: | Height: | Size: 32 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 123 KiB |
@ -0,0 +1,9 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8" ?> |
||||||
|
|
||||||
|
<manifest> |
||||||
|
|
||||||
|
<levels> |
||||||
|
<file>01.xml</file> |
||||||
|
</levels> |
||||||
|
|
||||||
|
</manifest> |
@ -0,0 +1,177 @@ |
|||||||
|
package com.porcupine.color; |
||||||
|
|
||||||
|
|
||||||
|
import java.awt.Color; |
||||||
|
|
||||||
|
import com.porcupine.math.Calc; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* HSV color |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
public class HSV { |
||||||
|
|
||||||
|
/** H */ |
||||||
|
public double h; |
||||||
|
/** S */ |
||||||
|
public double s; |
||||||
|
/** V */ |
||||||
|
public double v; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Create black color 0,0,0 |
||||||
|
*/ |
||||||
|
public HSV() {} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Color from HSV 0-1 |
||||||
|
* |
||||||
|
* @param h |
||||||
|
* @param s |
||||||
|
* @param v |
||||||
|
*/ |
||||||
|
public HSV(Number h, Number s, Number v) { |
||||||
|
this.h = h.doubleValue(); |
||||||
|
this.s = s.doubleValue(); |
||||||
|
this.v = v.doubleValue(); |
||||||
|
norm(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return hue 0-1 |
||||||
|
*/ |
||||||
|
public double h() |
||||||
|
{ |
||||||
|
return h; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return saturation 0-1 |
||||||
|
*/ |
||||||
|
public double s() |
||||||
|
{ |
||||||
|
return s; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return value/brightness 0-1 |
||||||
|
*/ |
||||||
|
public double v() |
||||||
|
{ |
||||||
|
return v; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set color to other color |
||||||
|
* |
||||||
|
* @param copied copied color |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public HSV setTo(HSV copied) |
||||||
|
{ |
||||||
|
h = copied.h; |
||||||
|
s = copied.s; |
||||||
|
v = copied.v; |
||||||
|
|
||||||
|
norm(); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set to H,S,V 0-1 |
||||||
|
* |
||||||
|
* @param h hue |
||||||
|
* @param s saturation |
||||||
|
* @param v value |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public HSV setTo(Number h, Number s, Number v) |
||||||
|
{ |
||||||
|
this.h = h.doubleValue(); |
||||||
|
this.s = s.doubleValue(); |
||||||
|
this.v = v.doubleValue(); |
||||||
|
norm(); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Fix numbers out of range 0-1 |
||||||
|
*/ |
||||||
|
public void norm() |
||||||
|
{ |
||||||
|
h = Calc.clampd(h, 0, 1); |
||||||
|
s = Calc.clampd(s, 0, 1); |
||||||
|
v = Calc.clampd(v, 0, 1); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Convert to RGB |
||||||
|
* |
||||||
|
* @return RGB representation |
||||||
|
*/ |
||||||
|
public RGB toRGB() |
||||||
|
{ |
||||||
|
norm(); |
||||||
|
|
||||||
|
int rgb = Color.HSBtoRGB((float) h, (float) s, (float) v); |
||||||
|
|
||||||
|
return RGB.fromHex(rgb); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Make from RGB |
||||||
|
* |
||||||
|
* @param color RGB |
||||||
|
* @return HSV |
||||||
|
*/ |
||||||
|
public static HSV fromRGB(RGB color) |
||||||
|
{ |
||||||
|
return color.toHSV(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() |
||||||
|
{ |
||||||
|
return "HSV[" + h + ";" + s + ";" + v + "]"; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean equals(Object obj) |
||||||
|
{ |
||||||
|
if (obj == null) return false; |
||||||
|
if (!(obj instanceof HSV)) return false; |
||||||
|
return ((HSV) obj).h == h && ((HSV) obj).s == s && ((HSV) obj).v == v; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public int hashCode() |
||||||
|
{ |
||||||
|
return Double.valueOf(h).hashCode() ^ Double.valueOf(s).hashCode() ^ Double.valueOf(v).hashCode(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get a copy |
||||||
|
* |
||||||
|
* @return copy |
||||||
|
*/ |
||||||
|
public HSV copy() |
||||||
|
{ |
||||||
|
return new HSV().setTo(this); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,382 @@ |
|||||||
|
package com.porcupine.color; |
||||||
|
|
||||||
|
|
||||||
|
import java.awt.Color; |
||||||
|
|
||||||
|
import com.porcupine.math.Calc; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* RGB color |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
public class RGB { |
||||||
|
|
||||||
|
/** White */ |
||||||
|
public static final RGB WHITE = new RGB(1, 1, 1); |
||||||
|
/** Black */ |
||||||
|
public static final RGB BLACK = new RGB(0, 0, 0); |
||||||
|
/** Red */ |
||||||
|
public static final RGB RED = new RGB(1, 0, 0); |
||||||
|
/** Lime green */ |
||||||
|
public static final RGB GREEN = new RGB(0, 1, 0); |
||||||
|
/** Blue */ |
||||||
|
public static final RGB BLUE = new RGB(0, 0, 1); |
||||||
|
/** Yellow */ |
||||||
|
public static final RGB YELLOW = new RGB(1, 1, 0); |
||||||
|
/** Purple */ |
||||||
|
public static final RGB PURPLE = new RGB(1, 0, 1); |
||||||
|
/** Cyan */ |
||||||
|
public static final RGB CYAN = new RGB(0, 1, 1); |
||||||
|
/** orange */ |
||||||
|
public static final RGB ORANGE = new RGB(1, 0.6, 0); |
||||||
|
/** no color (alpha=0) */ |
||||||
|
public static final RGB TRANSPARENT = new RGB(0, 0, 0, 0); |
||||||
|
|
||||||
|
/** R */ |
||||||
|
public double r; |
||||||
|
/** G */ |
||||||
|
public double g; |
||||||
|
/** B */ |
||||||
|
public double b; |
||||||
|
/** ALPHA */ |
||||||
|
public double a = 1; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Create black color 0,0,0 |
||||||
|
*/ |
||||||
|
public RGB() {} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get copy with custom alpha |
||||||
|
* |
||||||
|
* @param alpha alpha to set |
||||||
|
* @return copy w/ alpha |
||||||
|
*/ |
||||||
|
public RGB setAlpha(double alpha) |
||||||
|
{ |
||||||
|
return copy().setAlpha_ip(alpha); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* set alpha IP |
||||||
|
* |
||||||
|
* @param alpha alpha to set |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public RGB setAlpha_ip(double alpha) |
||||||
|
{ |
||||||
|
a = alpha; |
||||||
|
norm(); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get copy. |
||||||
|
* |
||||||
|
* @return copy |
||||||
|
*/ |
||||||
|
public RGB copy() |
||||||
|
{ |
||||||
|
return new RGB(r, g, b, a); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get copy with alpha multiplied by custom value |
||||||
|
* |
||||||
|
* @param alpha alpha to set |
||||||
|
* @return copy w/ alpha |
||||||
|
*/ |
||||||
|
public RGB mulAlpha(double alpha) |
||||||
|
{ |
||||||
|
return copy().mulAlpha_ip(alpha); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Multiply alpha by given number |
||||||
|
* |
||||||
|
* @param alpha alpha multiplier |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public RGB mulAlpha_ip(double alpha) |
||||||
|
{ |
||||||
|
a *= alpha; |
||||||
|
norm(); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Color from RGB 0-1 |
||||||
|
* |
||||||
|
* @param r red |
||||||
|
* @param g green |
||||||
|
* @param b blue |
||||||
|
*/ |
||||||
|
public RGB(Number r, Number g, Number b) { |
||||||
|
this.r = r.doubleValue(); |
||||||
|
this.g = g.doubleValue(); |
||||||
|
this.b = b.doubleValue(); |
||||||
|
norm(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Color from RGB 0-1 |
||||||
|
* |
||||||
|
* @param r red |
||||||
|
* @param g green |
||||||
|
* @param b blue |
||||||
|
* @param a alpha |
||||||
|
*/ |
||||||
|
public RGB(Number r, Number g, Number b, Number a) { |
||||||
|
this.r = r.doubleValue(); |
||||||
|
this.g = g.doubleValue(); |
||||||
|
this.b = b.doubleValue(); |
||||||
|
this.a = a.doubleValue(); |
||||||
|
norm(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Color from hex 0xRRGGBB |
||||||
|
* |
||||||
|
* @param hex hex integer |
||||||
|
*/ |
||||||
|
public RGB(int hex) { |
||||||
|
setTo(RGB.fromHex(hex)); |
||||||
|
norm(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Color from hex 0xRRGGBB |
||||||
|
* |
||||||
|
* @param hex hex integer |
||||||
|
* @param alpha alpha color |
||||||
|
*/ |
||||||
|
public RGB(int hex, double alpha) { |
||||||
|
setTo(RGB.fromHex(hex)); |
||||||
|
a = alpha; |
||||||
|
norm(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Color from other RGB and alpha channel |
||||||
|
* |
||||||
|
* @param color other RGB color |
||||||
|
* @param alpha new alpha channel |
||||||
|
*/ |
||||||
|
public RGB(RGB color, double alpha) { |
||||||
|
setTo(color); |
||||||
|
setAlpha_ip(alpha); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return red channel 0-1 |
||||||
|
*/ |
||||||
|
public double r() |
||||||
|
{ |
||||||
|
return r; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return green channel 0-1 |
||||||
|
*/ |
||||||
|
public double g() |
||||||
|
{ |
||||||
|
return g; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return blue channel 0-1 |
||||||
|
*/ |
||||||
|
public double b() |
||||||
|
{ |
||||||
|
return b; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return alpha 0-1 |
||||||
|
*/ |
||||||
|
public double a() |
||||||
|
{ |
||||||
|
return a; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set color to other color |
||||||
|
* |
||||||
|
* @param copied copied color |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public RGB setTo(RGB copied) |
||||||
|
{ |
||||||
|
r = copied.r; |
||||||
|
g = copied.g; |
||||||
|
b = copied.b; |
||||||
|
a = copied.a; |
||||||
|
|
||||||
|
norm(); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set to represent hex color |
||||||
|
* |
||||||
|
* @param hex hex integer RRGGBB |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public RGB setTo(int hex) |
||||||
|
{ |
||||||
|
setTo(RGB.fromHex(hex)); |
||||||
|
norm(); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set to R,G,B 0-1 |
||||||
|
* |
||||||
|
* @param r red |
||||||
|
* @param g green |
||||||
|
* @param b blue |
||||||
|
* @param a alpha |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public RGB setTo(Number r, Number g, Number b, Number a) |
||||||
|
{ |
||||||
|
this.r = r.doubleValue(); |
||||||
|
this.g = g.doubleValue(); |
||||||
|
this.b = b.doubleValue(); |
||||||
|
this.a = a.doubleValue(); |
||||||
|
norm(); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set to R,G,B 0-1 |
||||||
|
* |
||||||
|
* @param r red |
||||||
|
* @param g green |
||||||
|
* @param b blue |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public RGB setTo(Number r, Number g, Number b) |
||||||
|
{ |
||||||
|
this.r = r.doubleValue(); |
||||||
|
this.g = g.doubleValue(); |
||||||
|
this.b = b.doubleValue(); |
||||||
|
this.a = 1; |
||||||
|
norm(); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Fix numbers out of range 0-1 |
||||||
|
* |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public RGB norm() |
||||||
|
{ |
||||||
|
r = Calc.clampd(r, 0, 1); |
||||||
|
g = Calc.clampd(g, 0, 1); |
||||||
|
b = Calc.clampd(b, 0, 1); |
||||||
|
a = Calc.clampd(a, 0, 1); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get hex value 0xRRGGBB |
||||||
|
* |
||||||
|
* @return hex value RRGGBB |
||||||
|
*/ |
||||||
|
public int getHex() |
||||||
|
{ |
||||||
|
int ri = (int) Math.round(r * 255); |
||||||
|
int gi = (int) Math.round(g * 255); |
||||||
|
int bi = (int) Math.round(b * 255); |
||||||
|
return (ri << 16) | (gi << 8) | bi; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Convert to HSV |
||||||
|
* |
||||||
|
* @return HSV representation |
||||||
|
*/ |
||||||
|
public HSV toHSV() |
||||||
|
{ |
||||||
|
float[] hsv = { 0, 0, 0 }; |
||||||
|
Color.RGBtoHSB((int) (r * 255), (int) (g * 255), (int) (b * 255), hsv); |
||||||
|
return new HSV(hsv[0], hsv[1], hsv[2]); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Create color from hex 0xRRGGBB |
||||||
|
* |
||||||
|
* @param hex hex RRGGBB |
||||||
|
* @return the new color |
||||||
|
*/ |
||||||
|
public static RGB fromHex(int hex) |
||||||
|
{ |
||||||
|
int bi = hex & 0xff; |
||||||
|
int gi = (hex >> 8) & 0xff; |
||||||
|
int ri = (hex >> 16) & 0xff; |
||||||
|
return new RGB(ri / 255D, gi / 255D, bi / 255D); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Make from HSV |
||||||
|
* |
||||||
|
* @param color HSV color |
||||||
|
* @return RGB |
||||||
|
*/ |
||||||
|
public static RGB fromHSV(HSV color) |
||||||
|
{ |
||||||
|
return color.toRGB(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() |
||||||
|
{ |
||||||
|
return "RGB[" + r + ";" + g + ";" + b + ";" + a + "]"; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean equals(Object obj) |
||||||
|
{ |
||||||
|
if (obj == null) return false; |
||||||
|
if (!(obj instanceof RGB)) return false; |
||||||
|
return ((RGB) obj).r == r && ((RGB) obj).g == g && ((RGB) obj).b == b && ((RGB) obj).a == a; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public int hashCode() |
||||||
|
{ |
||||||
|
return Double.valueOf(r).hashCode() ^ Double.valueOf(g).hashCode() ^ Double.valueOf(b).hashCode() ^ Double.valueOf(a).hashCode(); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,930 @@ |
|||||||
|
package com.porcupine.coord; |
||||||
|
|
||||||
|
|
||||||
|
import java.util.Random; |
||||||
|
|
||||||
|
import com.porcupine.math.Calc; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Coordinate class, object with three or two double coordinates.<br> |
||||||
|
* |
||||||
|
* @author MightyPork |
||||||
|
*/ |
||||||
|
public class Coord { |
||||||
|
|
||||||
|
/** Coord [1;1;1] */ |
||||||
|
public static final Coord ONE = new Coord(1, 1, 1); |
||||||
|
|
||||||
|
/** Zero Coord */ |
||||||
|
public static final Coord ZERO = new Coord(0, 0); |
||||||
|
|
||||||
|
/** RNG */ |
||||||
|
protected static Random rand = new Random(); |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get distance to other point |
||||||
|
* |
||||||
|
* @param a point a |
||||||
|
* @param b point b |
||||||
|
* @return distance in units |
||||||
|
*/ |
||||||
|
public static double dist(Coord a, Coord b) |
||||||
|
{ |
||||||
|
return a.distTo(b); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Generate random coord (gaussian) |
||||||
|
* |
||||||
|
* @param max max distance from 0 |
||||||
|
* @return new coord |
||||||
|
*/ |
||||||
|
public static Coord random(double max) |
||||||
|
{ |
||||||
|
return new Coord(Calc.clampd(rand.nextGaussian() * max, -max * 2, max * 2), Calc.clampd(rand.nextGaussian() * max, -max * 2, max * 2), |
||||||
|
Calc.clampd(rand.nextGaussian() * max, -max * 2, max * 2)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Generate random coord (min-max) |
||||||
|
* |
||||||
|
* @param min min offset |
||||||
|
* @param max max offset |
||||||
|
* @return new coord |
||||||
|
*/ |
||||||
|
public static Coord random(double min, double max) |
||||||
|
{ |
||||||
|
return new Coord((rand.nextBoolean() ? -1 : 1) * (min + rand.nextDouble() * (max - min)), (rand.nextBoolean() ? -1 : 1) * (min + rand.nextDouble() * (max - min)), |
||||||
|
(rand.nextBoolean() ? -1 : 1) * (min + rand.nextDouble() * (max - min))); |
||||||
|
} |
||||||
|
|
||||||
|
private double animTime = 0; |
||||||
|
|
||||||
|
private Vec offs; |
||||||
|
|
||||||
|
private Coord start; |
||||||
|
|
||||||
|
private double time = 0; |
||||||
|
|
||||||
|
/** X coordinate */ |
||||||
|
public double x = 0; |
||||||
|
|
||||||
|
/** Y coordinate */ |
||||||
|
public double y = 0; |
||||||
|
|
||||||
|
/** Z coordinate */ |
||||||
|
public double z = 0; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Create zero coord |
||||||
|
*/ |
||||||
|
public Coord() {} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Create coord as a copy of another |
||||||
|
* |
||||||
|
* @param copied copied coord |
||||||
|
*/ |
||||||
|
public Coord(Coord copied) { |
||||||
|
this.x = copied.x; |
||||||
|
this.y = copied.y; |
||||||
|
this.z = copied.z; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Create 2D coord |
||||||
|
* |
||||||
|
* @param x x coordinate |
||||||
|
* @param y y coordinate |
||||||
|
*/ |
||||||
|
public Coord(Number x, Number y) { |
||||||
|
setTo(x, y); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Create 3D coord |
||||||
|
* |
||||||
|
* @param x x coordinate |
||||||
|
* @param y y coordinate |
||||||
|
* @param z z coordinate |
||||||
|
*/ |
||||||
|
public Coord(Number x, Number y, Number z) { |
||||||
|
setTo(x, y, z); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get a copy offset by vector |
||||||
|
* |
||||||
|
* @param vec offset |
||||||
|
* @return the offset copy |
||||||
|
*/ |
||||||
|
public Coord add(Coord vec) |
||||||
|
{ |
||||||
|
return copy().add_ip(vec); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get a copy offset by 2D coordinate |
||||||
|
* |
||||||
|
* @param x x offset |
||||||
|
* @param y y offset |
||||||
|
* @return the offset copy |
||||||
|
*/ |
||||||
|
public Coord add(Number x, Number y) |
||||||
|
{ |
||||||
|
return copy().add_ip(x, y); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get a copy offset by 3D coordinate |
||||||
|
* |
||||||
|
* @param x x offset |
||||||
|
* @param y y offset |
||||||
|
* @param z z offset |
||||||
|
* @return the offset copy |
||||||
|
*/ |
||||||
|
public Coord add(Number x, Number y, Number z) |
||||||
|
{ |
||||||
|
return copy().add_ip(x, y, z); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Offset by vector in place |
||||||
|
* |
||||||
|
* @param vec offset |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public Coord add_ip(Coord vec) |
||||||
|
{ |
||||||
|
this.x += vec.x; |
||||||
|
this.y += vec.y; |
||||||
|
this.z += vec.z; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Offset by 2D coordinate in place |
||||||
|
* |
||||||
|
* @param x x offset |
||||||
|
* @param y y offset |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public Coord add_ip(Number x, Number y) |
||||||
|
{ |
||||||
|
this.x += x.doubleValue(); |
||||||
|
this.y += y.doubleValue(); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Offset by 3D coordinate in place |
||||||
|
* |
||||||
|
* @param x x offset |
||||||
|
* @param y y offset |
||||||
|
* @param z z offset |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public Coord add_ip(Number x, Number y, Number z) |
||||||
|
{ |
||||||
|
this.x += x.doubleValue(); |
||||||
|
this.y += y.doubleValue(); |
||||||
|
this.z += z.doubleValue(); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Start animation |
||||||
|
* |
||||||
|
* @param time anim length |
||||||
|
*/ |
||||||
|
public void animate(double time) |
||||||
|
{ |
||||||
|
if (start == null) start = new Coord(); |
||||||
|
if (offs == null) offs = new Vec(); |
||||||
|
this.time = time; |
||||||
|
animTime = 0; |
||||||
|
offs = start.vecTo(this); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return copy of this vector |
||||||
|
*/ |
||||||
|
public Coord copy() |
||||||
|
{ |
||||||
|
return new Coord(x, y, z); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get distance to other point |
||||||
|
* |
||||||
|
* @param point other point |
||||||
|
* @return distance in units |
||||||
|
*/ |
||||||
|
public double distTo(Coord point) |
||||||
|
{ |
||||||
|
return Math.sqrt((point.x - x) * (point.x - x) + (point.y - y) * (point.y - y) + (point.z - z) * (point.z - z)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get copy divided by number |
||||||
|
* |
||||||
|
* @param d number to divide by |
||||||
|
* @return divided copy |
||||||
|
*/ |
||||||
|
public Coord div(double d) |
||||||
|
{ |
||||||
|
return copy().div_ip(d); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Divide by number in place |
||||||
|
* |
||||||
|
* @param d number to divide by |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public Coord div_ip(double d) |
||||||
|
{ |
||||||
|
if (d == 0) return this; |
||||||
|
x /= d; |
||||||
|
y /= d; |
||||||
|
z /= d; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public boolean equals(Object obj) |
||||||
|
{ |
||||||
|
if (obj == null) return false; |
||||||
|
if (!obj.getClass().isAssignableFrom(Coord.class)) return false; |
||||||
|
Coord other = (Coord) obj; |
||||||
|
return x == other.x && y == other.y && z == other.z; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get current value (animated) |
||||||
|
* |
||||||
|
* @return curent value |
||||||
|
*/ |
||||||
|
public Coord getDelta() |
||||||
|
{ |
||||||
|
if (start == null) start = new Coord(); |
||||||
|
if (offs == null) offs = new Vec(); |
||||||
|
if (isFinished()) return this; |
||||||
|
return new Coord(start.add(offs.scale(animTime / time))); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public int hashCode() |
||||||
|
{ |
||||||
|
return Double.valueOf(x).hashCode() ^ Double.valueOf(y).hashCode() ^ Double.valueOf(z).hashCode(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get if animation is finished |
||||||
|
* |
||||||
|
* @return is finished |
||||||
|
*/ |
||||||
|
public boolean isFinished() |
||||||
|
{ |
||||||
|
return animTime >= time; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Check if this rectangle in inside a rectangular zone |
||||||
|
* |
||||||
|
* @param min min coord |
||||||
|
* @param max max coord |
||||||
|
* @return is inside |
||||||
|
*/ |
||||||
|
public boolean isInRect(Coord min, Coord max) |
||||||
|
{ |
||||||
|
return (x >= min.x && x <= max.x) && (y >= min.y && y <= max.y) && (z >= min.z && z <= max.z); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Check if this rectangle in inside a rectangular zone |
||||||
|
* |
||||||
|
* @param rect checked rect. |
||||||
|
* @return is inside |
||||||
|
*/ |
||||||
|
public boolean isInRect(Rect rect) |
||||||
|
{ |
||||||
|
return isInRect(rect.min, rect.max); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get middle of line to other point |
||||||
|
* |
||||||
|
* @param other other point |
||||||
|
* @return middle |
||||||
|
*/ |
||||||
|
public Coord midTo(Coord other) |
||||||
|
{ |
||||||
|
return add(vecTo(other).scale(0.5)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Multiply by number |
||||||
|
* |
||||||
|
* @param d number |
||||||
|
* @return multiplied copy |
||||||
|
*/ |
||||||
|
public Coord mul(double d) |
||||||
|
{ |
||||||
|
return copy().mul_ip(d); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Multiply coords by number |
||||||
|
* |
||||||
|
* @param xd x multiplier |
||||||
|
* @param yd y multiplier |
||||||
|
* @param zd z multiplier |
||||||
|
* @return multiplied copy |
||||||
|
*/ |
||||||
|
public Coord mul(double xd, double yd, double zd) |
||||||
|
{ |
||||||
|
return copy().mul_ip(xd, yd, zd); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Multiply by number in place |
||||||
|
* |
||||||
|
* @param d multiplier |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public Coord mul_ip(double d) |
||||||
|
{ |
||||||
|
x *= d; |
||||||
|
y *= d; |
||||||
|
z *= d; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Multiply coords by number in place |
||||||
|
* |
||||||
|
* @param xd x multiplier |
||||||
|
* @param yd y multiplier |
||||||
|
* @param zd z multiplier |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public Coord mul_ip(double xd, double yd, double zd) |
||||||
|
{ |
||||||
|
x *= xd; |
||||||
|
y *= yd; |
||||||
|
z *= zd; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* offset randomly |
||||||
|
* |
||||||
|
* @param max max +- offset |
||||||
|
* @return offset coord |
||||||
|
*/ |
||||||
|
public Coord random_offset(double max) |
||||||
|
{ |
||||||
|
Coord r = random(1); |
||||||
|
Vec v = new Vec(r); |
||||||
|
v.norm_ip(0.00001 + rand.nextDouble() * max); |
||||||
|
return copy().add_ip(v); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* offset randomly |
||||||
|
* |
||||||
|
* @param min min offset |
||||||
|
* @param max max offset |
||||||
|
* @return offset coord |
||||||
|
*/ |
||||||
|
public Coord random_offset(double min, double max) |
||||||
|
{ |
||||||
|
return copy().add_ip(random(min, max)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* offset randomly in place |
||||||
|
* |
||||||
|
* @param max max +- offset |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public Coord random_offset_ip(double max) |
||||||
|
{ |
||||||
|
return add(random(max)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* offset randomly in place |
||||||
|
* |
||||||
|
* @param min min offset |
||||||
|
* @param max max offset |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public Coord random_offset_ip(double min, double max) |
||||||
|
{ |
||||||
|
add(random(min, max)); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Remember position (other changes will be for animation) |
||||||
|
*/ |
||||||
|
public void remember() |
||||||
|
{ |
||||||
|
if (start == null) start = new Coord(); |
||||||
|
if (offs == null) offs = new Vec(); |
||||||
|
start.setTo(this); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get a copy with rounded coords |
||||||
|
* |
||||||
|
* @return rounded copy |
||||||
|
*/ |
||||||
|
public Coord round() |
||||||
|
{ |
||||||
|
return copy().round_ip(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Round in place |
||||||
|
* |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public Coord round_ip() |
||||||
|
{ |
||||||
|
x = Math.round(x); |
||||||
|
y = Math.round(y); |
||||||
|
z = Math.round(z); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set to max values of this and other coord |
||||||
|
* |
||||||
|
* @param other other coord |
||||||
|
*/ |
||||||
|
public void setMax(Coord other) |
||||||
|
{ |
||||||
|
x = Math.max(x, other.x); |
||||||
|
y = Math.max(y, other.y); |
||||||
|
z = Math.max(z, other.z); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set to min values of this and other coord |
||||||
|
* |
||||||
|
* @param other other coord |
||||||
|
*/ |
||||||
|
public void setMin(Coord other) |
||||||
|
{ |
||||||
|
x = Math.min(x, other.x); |
||||||
|
y = Math.min(y, other.y); |
||||||
|
z = Math.min(z, other.z); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set coordinates to match other coord |
||||||
|
* |
||||||
|
* @param copied coord whose coordinates are used |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public Coord setTo(Coord copied) |
||||||
|
{ |
||||||
|
setTo(copied.x, copied.y, copied.z); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set 2D coordinates to |
||||||
|
* |
||||||
|
* @param x x coordinate |
||||||
|
* @param y y coordinate |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public Coord setTo(Number x, Number y) |
||||||
|
{ |
||||||
|
setTo(x, y, 0); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set 3D coordinates to |
||||||
|
* |
||||||
|
* @param x x coordinate |
||||||
|
* @param y y coordinate |
||||||
|
* @param z z coordinate |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public Coord setTo(Number x, Number y, Number z) |
||||||
|
{ |
||||||
|
this.x = x.doubleValue(); |
||||||
|
this.y = y.doubleValue(); |
||||||
|
this.z = z.doubleValue(); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set X coordinate in a copy |
||||||
|
* |
||||||
|
* @param x x coordinate |
||||||
|
* @return copy with set coordinate |
||||||
|
*/ |
||||||
|
public Coord setX(Number x) |
||||||
|
{ |
||||||
|
return copy().setX_ip(x); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set X coordinate in place |
||||||
|
* |
||||||
|
* @param x x coordinate |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public Coord setX_ip(Number x) |
||||||
|
{ |
||||||
|
this.x = x.doubleValue(); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set Y coordinate in a copy |
||||||
|
* |
||||||
|
* @param y y coordinate |
||||||
|
* @return copy with set coordinate |
||||||
|
*/ |
||||||
|
public Coord setY(Number y) |
||||||
|
{ |
||||||
|
return copy().setY_ip(y); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set Y coordinate in place |
||||||
|
* |
||||||
|
* @param y y coordinate |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public Coord setY_ip(Number y) |
||||||
|
{ |
||||||
|
this.y = y.doubleValue(); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set Z coordinate in a copy |
||||||
|
* |
||||||
|
* @param z z coordinate |
||||||
|
* @return copy with set coordinate |
||||||
|
*/ |
||||||
|
public Coord setZ(Number z) |
||||||
|
{ |
||||||
|
return copy().setZ_ip(z); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Set Z coordinate in place |
||||||
|
* |
||||||
|
* @param z z coordinate |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public Coord setZ_ip(Number z) |
||||||
|
{ |
||||||
|
this.z = z.doubleValue(); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get size |
||||||
|
* |
||||||
|
* @return size |
||||||
|
*/ |
||||||
|
public double size() |
||||||
|
{ |
||||||
|
return new Vec(this).size(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get a copy subtracted by vector |
||||||
|
* |
||||||
|
* @param vec offset |
||||||
|
* @return the offset copy |
||||||
|
*/ |
||||||
|
public Coord sub(Coord vec) |
||||||
|
{ |
||||||
|
return copy().sub_ip(vec); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get a copy subtracted by 2D coordinate |
||||||
|
* |
||||||
|
* @param x x offset |
||||||
|
* @param y y offset |
||||||
|
* @return the offset copy |
||||||
|
*/ |
||||||
|
public Coord sub(Number x, Number y) |
||||||
|
{ |
||||||
|
return copy().sub_ip(x, y); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Get a copy subtracted by 3D coordinate |
||||||
|
* |
||||||
|
* @param x x offset |
||||||
|
* @param y y offset |
||||||
|
* @param z z offset |
||||||
|
* @return the offset copy |
||||||
|
*/ |
||||||
|
public Coord sub(Number x, Number y, Number z) |
||||||
|
{ |
||||||
|
return copy().sub_ip(x, y, z); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Offset by vector in place |
||||||
|
* |
||||||
|
* @param vec offset |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public Coord sub_ip(Coord vec) |
||||||
|
{ |
||||||
|
this.x -= vec.x; |
||||||
|
this.y -= vec.y; |
||||||
|
this.z -= vec.z; |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Offset by 2D coordinate in place |
||||||
|
* |
||||||
|
* @param x x offset |
||||||
|
* @param y y offset |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public Coord sub_ip(Number x, Number y) |
||||||
|
{ |
||||||
|
this.x -= x.doubleValue(); |
||||||
|
this.y -= y.doubleValue(); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Offset by 3D coordinate in place |
||||||
|
* |
||||||
|
* @param x x offset |
||||||
|
* @param y y offset |
||||||
|
* @param z z offset |
||||||
|
* @return this |
||||||
|
*/ |
||||||
|
public Coord sub_ip(Number x, Number y, Number z) |
||||||
|
{ |
||||||
|
this.x -= x.doubleValue(); |
||||||
|
this.y -= y.doubleValue(); |
||||||
|
this.z -= z.doubleValue(); |
||||||
|
return this; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Convert X and Y coordinates of this coord to a new CoordI. |
||||||
|
* |
||||||
|
* @return the new CoordI |
||||||
|
*/ |
||||||
|
public CoordI toCoordI() |
||||||
|
{ |
||||||
|
return new CoordI((int) Math.round(x), (int) Math.round(y)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
@Override |
||||||
|
public String toString() |
||||||
|
{ |
||||||
|
return "[ " + x + " ; " + y + " ; " + z + " ]"; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// private Coord last;
|
||||||
|
// private Vec offs;
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Store current value as LAST
|
||||||
|
// */
|
||||||
|
// public void pushLast() {
|
||||||
|
// if (last == null) last = new Coord();
|
||||||
|
// if (offs == null) offs = new Vec();
|
||||||
|
// last.setTo(this);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Apply coordinates change for delta time
|
||||||
|
// */
|
||||||
|
// public void update() {
|
||||||
|
// if (last == null) last = new Coord();
|
||||||
|
// if (offs == null) offs = new Vec();
|
||||||
|
// offs = last.vecTo(this);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// /**
|
||||||
|
// * Get coordinate at delta time since LAST
|
||||||
|
// *
|
||||||
|
// * @param delta delta time 0-1
|
||||||
|
// * @return delta pos
|
||||||
|
// */
|
||||||
|
// public Coord getDelta(double delta) {
|
||||||
|
// if (last == null) last = new Coord();
|
||||||
|
// if (offs == null) offs = new Vec();
|
||||||
|
// return new Coord(this.add(offs.scale(delta)));
|
||||||
|
// }
|
||||||
|
|
||||||
|
/** |
||||||
|
* Update delta timing |
||||||
|
* |
||||||
|
* @param delta delta time to add |
||||||
|
*/ |
||||||
|
public void update(double delta) |
||||||
|
{ |
||||||
|
if (start == null) start = new Coord(); |
||||||
|
if (offs == null) offs = new Vec(); |
||||||
|
animTime = Calc.clampd(animTime + delta, 0, time); |
||||||
|
if (isFinished()) { |
||||||
|
time = 0; |
||||||
|
animTime = 0; |
||||||
|
start.setTo(this); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Create vector from this point to other point |
||||||
|
* |
||||||
|
* @param point second point |
||||||
|
* @return vector |
||||||
|
*/ |
||||||
|
public Vec vecTo(Coord point) |
||||||
|
{ |
||||||
|
return (Vec) (new Vec(point)).add(new Vec(this).neg()); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return X as double |
||||||
|
*/ |
||||||
|
public double x() |
||||||
|
{ |
||||||
|
return x; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return X as double |
||||||
|
*/ |
||||||
|
public double xd() |
||||||
|
{ |
||||||
|
return x; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return X as float |
||||||
|
*/ |
||||||
|
public float xf() |
||||||
|
{ |
||||||
|
return (float) x; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return X as int |
||||||
|
*/ |
||||||
|
public int xi() |
||||||
|
{ |
||||||
|
return (int) Math.round(x); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return Y as double |
||||||
|
*/ |
||||||
|
public double y() |
||||||
|
{ |
||||||
|
return y; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return Y as double |
||||||
|
*/ |
||||||
|
public double yd() |
||||||
|
{ |
||||||
|
return y; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return Y as float |
||||||
|
*/ |
||||||
|
public float yf() |
||||||
|
{ |
||||||
|
return (float) y; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return Y as int |
||||||
|
*/ |
||||||
|
public int yi() |
||||||
|
{ |
||||||
|
return (int) Math.round(y); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return Z as double |
||||||
|
*/ |
||||||
|
public double z() |
||||||
|
{ |
||||||
|
return z; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return Z as double |
||||||
|
*/ |
||||||
|
public double zd() |
||||||
|
{ |
||||||
|
return z; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return Z as float |
||||||
|
*/ |
||||||
|
public float zf() |
||||||
|
{ |
||||||
|
return (float) z; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* @return Z as int |
||||||
|
*/ |
||||||
|
public int zi() |
||||||
|
{ |
||||||
|
return (int) Math.round(z); |
||||||
|
} |
||||||
|
} |