avoid sqrt, just flip that vector

This commit is contained in:
Hannes Janetzek 2013-01-04 12:54:35 +01:00
parent 6681247215
commit 3484110e08

View File

@ -61,7 +61,7 @@ public final class LineLayer extends Layer {
* whether to connect start- and end-point * whether to connect start- and end-point
*/ */
public void addLine(float[] points, short[] index, boolean closed) { public void addLine(float[] points, short[] index, boolean closed) {
float x, y, nextX, nextY, prevX, prevY; float x, y, nextX, nextY;
float a, ux, uy, vx, vy, wx, wy; float a, ux, uy, vx, vy, wx, wy;
int tmax = Tile.TILE_SIZE + 10; int tmax = Tile.TILE_SIZE + 10;
@ -219,21 +219,23 @@ public final class LineLayer extends Layer {
// outside means line is probably clipped // outside means line is probably clipped
// TODO should align ending with tile boundary // TODO should align ending with tile boundary
// for now, just extend the line a little // for now, just extend the line a little
float tx = vx;
float ty = vy;
if (squared) { if (squared) {
vx = 0; tx = 0;
vy = 0; ty = 0;
} else if (!outside) { } else if (!outside) {
vx *= 0.5; tx *= 0.5;
vy *= 0.5; ty *= 0.5;
} }
if (rounded) if (rounded)
verticesCnt -= 2; verticesCnt -= 2;
// add first vertex twice // add first vertex twice
ddx = (int) ((ux - vx) * DIR_SCALE); ddx = (int) ((ux - tx) * DIR_SCALE);
ddy = (int) ((uy - vy) * DIR_SCALE); ddy = (int) ((uy - ty) * DIR_SCALE);
dx = (short) (0 | ddx & DIR_MASK); dx = (short) (0 | ddx & DIR_MASK);
dy = (short) (1 | ddy & DIR_MASK); dy = (short) (1 | ddy & DIR_MASK);
@ -259,8 +261,8 @@ public final class LineLayer extends Layer {
opos = 0; opos = 0;
} }
ddx = (int) (-(ux + vx) * DIR_SCALE); ddx = (int) (-(ux + tx) * DIR_SCALE);
ddy = (int) (-(uy + vy) * DIR_SCALE); ddy = (int) (-(uy + ty) * DIR_SCALE);
v[opos++] = ox; v[opos++] = ox;
v[opos++] = oy; v[opos++] = oy;
@ -269,11 +271,12 @@ public final class LineLayer extends Layer {
} }
prevX = x;
prevY = y;
x = nextX; x = nextX;
y = nextY; y = nextY;
boolean flip = false; boolean flip = false;
// Unit vector pointing back to previous node
vx *= -1;
vy *= -1;
for (;;) { for (;;) {
if (ipos < pos + length) { if (ipos < pos + length) {
@ -287,13 +290,6 @@ public final class LineLayer extends Layer {
} else } else
break; break;
// Unit vector pointing back to previous node
vx = prevX - x;
vy = prevY - y;
a = (float) Math.sqrt(vx * vx + vy * vy);
vx = (vx / a);
vy = (vy / a);
// Unit vector pointing forward to next node // Unit vector pointing forward to next node
wx = nextX - x; wx = nextX - x;
wy = nextY - y; wy = nextY - y;
@ -361,20 +357,13 @@ public final class LineLayer extends Layer {
v[opos++] = (short) (2 | -ddx & DIR_MASK); v[opos++] = (short) (2 | -ddx & DIR_MASK);
v[opos++] = (short) (1 | -ddy & DIR_MASK); v[opos++] = (short) (1 | -ddy & DIR_MASK);
prevX = x;
prevY = y;
x = nextX; x = nextX;
y = nextY; y = nextY;
vx = -1 * wx;
vy = -1 * wy;
} }
vx = prevX - x;
vy = prevY - y;
a = (float) Math.sqrt(vx * vx + vy * vy);
vx = (vx / a);
vy = (vy / a);
ux = vy; ux = vy;
uy = -vx; uy = -vx;