package com.nightonke.boommenu.Piece;
import android.content.Context;
import android.graphics.Point;
import com.nightonke.boommenu.BoomButtons.BoomButtonBuilder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
/**
* Created by Weiping Huang at 23:50 on 16/11/6
* For Personal Open Source
* Contact me at 2584541288@qq.com or nightonke@outlook.com
* For more projects: https://github.com/Nightonke
*/
public class PiecePlaceManager {
public static ArrayList<Point> getDotPositions(PiecePlaceEnum piecePlaceEnum,
Point parentSize,
int dotRadius,
int dotHorizontalMargin,
int dotVerticalMargin,
int dotInclinedMargin) {
ArrayList<Point> positions = new ArrayList<>();
float a, b, c, e;
float r = dotRadius, hm = dotHorizontalMargin, vm = dotVerticalMargin, im = dotInclinedMargin;
switch (piecePlaceEnum) {
case DOT_1:
positions.add(point(0, 0));
break;
case DOT_2_1:
positions.add(point(-hm / 2 - r, 0));
positions.add(point(hm / 2 + r, 0));
break;
case DOT_2_2:
positions.add(point(0, -vm / 2 - r));
positions.add(point(0, vm / 2 + r));
break;
case DOT_3_1:
positions.add(point(-hm - 2 * r, 0));
positions.add(point(0, 0));
positions.add(point(hm + 2 * r, 0));
break;
case DOT_3_2:
positions.add(point(0, -hm - 2 * r));
positions.add(point(0, 0));
positions.add(point(0, hm + 2 * r));
break;
case DOT_3_3:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(-b, -a));
positions.add(point(b, -a));
positions.add(point(0, c));
break;
case DOT_3_4:
b = hm / 2f + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(0, -c));
positions.add(point(-b, a));
positions.add(point(b, a));
break;
case DOT_4_1:
positions.add(point(-hm / 2 - r, -vm / 2 - r));
positions.add(point(hm / 2 + r, -vm / 2 - r));
positions.add(point(-hm / 2 - r, vm / 2 + r));
positions.add(point(hm / 2 + r, vm / 2 + r));
break;
case DOT_4_2:
a = (float) ((2 * r + im) / Math.sqrt(2));
positions.add(point(0, -a));
positions.add(point(a, 0));
positions.add(point(0, a));
positions.add(point(-a, 0));
break;
case DOT_5_1:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(-2 * b, -a));
positions.add(point(0, -a));
positions.add(point(2 * b, -a));
positions.add(point(-hm / 2 - r, c));
positions.add(point(hm / 2 + r, c));
break;
case DOT_5_2:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(-hm / 2 - r, -c));
positions.add(point(hm / 2 + r, -c));
positions.add(point(-2 * b, a));
positions.add(point(0, a));
positions.add(point(2 * b, a));
break;
case DOT_5_3:
positions.add(point(0, 0));
positions.add(point(0, -vm - 2 * r));
positions.add(point(hm + 2 * r, 0));
positions.add(point(0, vm + 2 * r));
positions.add(point(-hm - 2 * r, 0));
break;
case DOT_5_4:
a = (float) ((2 * r + im) / Math.sqrt(2));
positions.add(point(0, 0));
positions.add(point(a, -a));
positions.add(point(a, a));
positions.add(point(-a, a));
positions.add(point(-a, -a));
break;
case DOT_6_1:
positions.add(point(-hm - 2 * r, -vm / 2 - r));
positions.add(point(0, -vm / 2 - r));
positions.add(point(hm + 2 * r, -vm / 2 - r));
positions.add(point(-hm - 2 * r, vm / 2 + r));
positions.add(point(0, vm / 2 + r));
positions.add(point(hm + 2 * r, vm / 2 + r));
break;
case DOT_6_2:
positions.add(point(-hm / 2 - r, -vm - 2 * r));
positions.add(point(-hm / 2 - r, 0));
positions.add(point(-hm / 2 - r, vm + 2 * r));
positions.add(point(hm / 2 + r, -vm - 2 * r));
positions.add(point(hm / 2 + r, 0));
positions.add(point(hm / 2 + r, vm + 2 * r));
break;
case DOT_6_3:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(-b, -a - c));
positions.add(point(b, -a -c));
positions.add(point(2 * b, 0));
positions.add(point(b, a + c));
positions.add(point(-b, a + c));
positions.add(point(-2 * b, 0));
break;
case DOT_6_4:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(0, -2 * b));
positions.add(point(a + c, -b));
positions.add(point(a + c, b));
positions.add(point(0, 2 * b));
positions.add(point(-a - c, b));
positions.add(point(-a - c, -b));
break;
case DOT_6_5:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
e = c - a;
positions.add(point(-2 * b, -a - c + e));
positions.add(point(0, -a - c + e));
positions.add(point(2 * b, -a - c + e));
positions.add(point(-hm / 2 - r, e));
positions.add(point(hm / 2 + r, e));
positions.add(point(0, a + c + e));
break;
case DOT_6_6:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
e = c - a;
positions.add(point(0, -a - c - e));
positions.add(point(-hm / 2 - r, -e));
positions.add(point(hm / 2 + r, -e));
positions.add(point(-2 * b, a + c - e));
positions.add(point(0, a + c - e));
positions.add(point(2 * b, a + c - e));
break;
case DOT_7_1:
positions.add(point(-hm - 2 * r, -vm - 2 * r));
positions.add(point(0, -vm - 2 * r));
positions.add(point(hm + 2 * r, -vm - 2 * r));
positions.add(point(-hm - 2 * r, 0));
positions.add(point(0, 0));
positions.add(point(hm + 2 * r, 0));
positions.add(point(0, vm + 2 * r));
break;
case DOT_7_2:
positions.add(point(0, -vm - 2 * r));
positions.add(point(-hm - 2 * r, 0));
positions.add(point(0, 0));
positions.add(point(hm + 2 * r, 0));
positions.add(point(-hm - 2 * r, vm + 2 * r));
positions.add(point(0, vm + 2 * r));
positions.add(point(hm + 2 * r, vm + 2 * r));
break;
case DOT_7_3:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(0, 0));
positions.add(point(-b, -a - c));
positions.add(point(b, -a - c));
positions.add(point(2 * b, 0));
positions.add(point(b, a + c));
positions.add(point(-b, a + c));
positions.add(point(-2 * b, 0));
break;
case DOT_7_4:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(0, 0));
positions.add(point(0, -2 * b));
positions.add(point(a + c, -b));
positions.add(point(a + c, b));
positions.add(point(0, 2 * b));
positions.add(point(-a - c, b));
positions.add(point(-a - c, -b));
break;
case DOT_7_5:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(-3 * b, -a));
positions.add(point(-b, -a));
positions.add(point(b, -a));
positions.add(point(3 * b, -a));
positions.add(point(-2 * b, c));
positions.add(point(0, c));
positions.add(point(2 * b, c));
break;
case DOT_7_6:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(-2 * b, -c));
positions.add(point(0, -c));
positions.add(point(2 * b, -c));
positions.add(point(-3 * b, a));
positions.add(point(-b, a));
positions.add(point(b, a));
positions.add(point(3 * b, a));
break;
case DOT_8_1:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(-2 * b, -a - c));
positions.add(point(0, -a - c));
positions.add(point(2 * b, -a - c));
positions.add(point(-hm / 2 - r, 0));
positions.add(point(hm / 2 + r, 0));
positions.add(point(-2 * b, a + c));
positions.add(point(0, a + c));
positions.add(point(2 * b, a + c));
break;
case DOT_8_2:
b = vm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(-a - c, -2 * b));
positions.add(point(-a - c, 0));
positions.add(point(-a - c, 2 * b));
positions.add(point(0, -vm / 2 - r));
positions.add(point(0, vm / 2 + r));
positions.add(point(a + c, -2 * b));
positions.add(point(a + c, 0));
positions.add(point(a + c, 2 * b));
break;
case DOT_8_3:
positions.add(point(-hm - 2 * r, -vm - 2 * r));
positions.add(point(0, -vm - 2 * r));
positions.add(point(hm + 2 * r, -vm - 2 * r));
positions.add(point(-hm - 2 * r, 0));
positions.add(point(hm + 2 * r, 0));
positions.add(point(-hm - 2 * r, vm + 2 * r));
positions.add(point(0, vm + 2 * r));
positions.add(point(hm + 2 * r, vm + 2 * r));
break;
case DOT_8_4:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(0, -2 * a - 2 * c));
positions.add(point(-hm / 2 - r, -a - c));
positions.add(point(hm / 2 + r, -a - c));
positions.add(point(-2 * b, 0));
positions.add(point(2 * b, 0));
positions.add(point(-hm / 2 - r, a + c));
positions.add(point(hm / 2 + r, a + c));
positions.add(point(0, 2 * a + 2 * c));
break;
case DOT_8_5:
a = (float) ((2 * r + im) / Math.sqrt(2));
positions.add(point(0, -2 * a));
positions.add(point(a, -a));
positions.add(point(2 * a, 0));
positions.add(point(a, a));
positions.add(point(0, 2 * a));
positions.add(point(-a, a));
positions.add(point(-2 * a, 0));
positions.add(point(-a, -a));
break;
case DOT_8_6:
positions.add(point(-hm * 3 / 2 - 3 * r, -vm / 2 - r));
positions.add(point(-hm / 2 - r, -vm / 2 - r));
positions.add(point(hm / 2 + r, -vm / 2 - r));
positions.add(point(hm * 3 / 2 + 3 * r, -vm / 2 - r));
positions.add(point(-hm * 3 / 2 - 3 * r, vm / 2 + r));
positions.add(point(-hm / 2 - r, vm / 2 + r));
positions.add(point(hm / 2 + r, vm / 2 + r));
positions.add(point(hm * 3 / 2 + 3 * r, vm / 2 + r));
break;
case DOT_8_7:
positions.add(point(-hm / 2 - r, -vm * 3 / 2 - 3 * r));
positions.add(point(hm / 2 + r, -vm * 3 / 2 - 3 * r));
positions.add(point(-hm / 2 - r, -vm / 2 - r));
positions.add(point(hm / 2 + r, -vm / 2 - r));
positions.add(point(-hm / 2 - r, vm / 2 + r));
positions.add(point(hm / 2 + r, vm / 2 + r));
positions.add(point(-hm / 2 - r, vm * 3 / 2 + 3 * r));
positions.add(point(hm / 2 + r, vm * 3 / 2 + 3 * r));
break;
case DOT_9_1:
positions.add(point(-hm - 2 * r, -vm - 2 * r));
positions.add(point(0, -vm - 2 * r));
positions.add(point(hm + 2 * r, -vm - 2 * r));
positions.add(point(-hm - 2 * r, 0));
positions.add(point(0, 0));
positions.add(point(hm + 2 * r, 0));
positions.add(point(-hm - 2 * r, vm + 2 * r));
positions.add(point(0, vm + 2 * r));
positions.add(point(hm + 2 * r, vm + 2 * r));
break;
case DOT_9_2:
b = hm / 2 + r;
c = (float) (b / (Math.sqrt(3) / 2));
a = c / 2;
positions.add(point(0, -2 * a - 2 * c));
positions.add(point(-hm / 2 - r, -a - c));
positions.add(point(hm / 2 + r, -a - c));
positions.add(point(-2 * b, 0));
positions.add(point(0, 0));
positions.add(point(2 * b, 0));
positions.add(point(-hm / 2 - r, a + c));
positions.add(point(hm / 2 + r, a + c));
positions.add(point(0, 2 * a + 2 * c));
break;
case DOT_9_3:
a = (float) ((2 * r + im) / Math.sqrt(2));
positions.add(point(0, -2 * a));
positions.add(point(a, -a));
positions.add(point(2 * a, 0));
positions.add(point(a, a));
positions.add(point(0, 0));
positions.add(point(0, 2 * a));
positions.add(point(-a, a));
positions.add(point(-2 * a, 0));
positions.add(point(-a, -a));
break;
default:
throw new RuntimeException("Unknown piece-place-enum!");
}
for (Point point : positions) point.offset(parentSize.x / 2 - dotRadius, parentSize.y / 2 - dotRadius);
return positions;
}
public static ArrayList<Point> getHamPositions(PiecePlaceEnum piecePlaceEnum,
Point parentSize,
int hamWidth,
int hamHeight,
int hamVerticalMargin) {
ArrayList<Point> positions = new ArrayList<>();
float w = hamWidth, h = hamHeight, vm = hamVerticalMargin;
int half = piecePlaceEnum.pieceNumber() / 2;
if (piecePlaceEnum.pieceNumber() % 2 == 0) {
for (int i = half - 1; i >= 0; i--) positions.add(point(0, -h / 2 - vm / 2 - i * (h + vm)));
for (int i = 0; i < h; i++) positions.add(point(0, h / 2 + vm / 2 + i * (h + vm)));
} else {
for (int i = half - 1; i >= 0; i--) positions.add(point(0, -h - vm - i * (h + vm)));
positions.add(point(0, 0));
for (int i = 0; i < h; i++) positions.add(point(0, h + vm + i * (h + vm)));
}
for (Point point : positions) point.offset((int) (parentSize.x / 2 - w / 2), (int) (parentSize.y / 2 - h / 2));
return positions;
}
public static ArrayList<Point> getShareDotPositions(Point parentSize,
int dotRadius,
int dotNumber,
int shareLineLength) {
ArrayList<Point> positions = new ArrayList<>();
float h = (float) (shareLineLength * Math.sqrt(3) / 3);
for (int i = 0; i < dotNumber; i++) {
switch (i % 3) {
case 0: positions.add(point(h / 2, -shareLineLength / 2)); break;
case 1: positions.add(point(-h, 0)); break;
case 2: positions.add(point(h / 2, shareLineLength / 2)); break;
}
}
Collections.sort(positions, new Comparator<Point>() {
@Override
public int compare(Point lhs, Point rhs) {
return ((Integer)(lhs.y)).compareTo(rhs.y);
}
});
for (Point point : positions) point.offset(parentSize.x / 2 - dotRadius, parentSize.y / 2 - dotRadius);
return positions;
}
public static BoomPiece createPiece(Context context,
PiecePlaceEnum piecePlaceEnum,
BoomButtonBuilder builder,
int pieceCornerRadius) {
switch (piecePlaceEnum) {
case DOT_1:
case DOT_2_1:
case DOT_2_2:
case DOT_3_1:
case DOT_3_2:
case DOT_3_3:
case DOT_3_4:
case DOT_4_1:
case DOT_4_2:
case DOT_5_1:
case DOT_5_2:
case DOT_5_3:
case DOT_5_4:
case DOT_6_1:
case DOT_6_2:
case DOT_6_3:
case DOT_6_4:
case DOT_6_5:
case DOT_6_6:
case DOT_7_1:
case DOT_7_2:
case DOT_7_3:
case DOT_7_4:
case DOT_7_5:
case DOT_7_6:
case DOT_8_1:
case DOT_8_2:
case DOT_8_3:
case DOT_8_4:
case DOT_8_5:
case DOT_8_6:
case DOT_8_7:
case DOT_9_1:
case DOT_9_2:
case DOT_9_3:
case Share:
return createDot(context, builder, pieceCornerRadius);
case HAM_1:
case HAM_2:
case HAM_3:
case HAM_4:
case HAM_5:
case HAM_6:
return createHam(context, builder, pieceCornerRadius);
}
throw new RuntimeException("Unknown button-enum!");
}
private static Dot createDot(Context context, BoomButtonBuilder builder, int pieceCornerRadius) {
Dot dot = new Dot(context);
builder.piece(dot);
dot.init(builder.pieceColor(context), pieceCornerRadius);
return dot;
}
private static Ham createHam(Context context, BoomButtonBuilder builder, int pieceCornerRadius) {
Ham ham = new Ham(context);
builder.piece(ham);
ham.init(builder.pieceColor(context), pieceCornerRadius);
return ham;
}
private static Point point(float x, float y) {
return new Point((int) x, (int) y);
}
private static Point point(double x, double y) {
return new Point((int) x, (int) y);
}
private static Point point(int x, int y) {
return new Point(x, y);
}
private static PiecePlaceManager ourInstance = new PiecePlaceManager();
public static PiecePlaceManager getInstance() {
return ourInstance;
}
private PiecePlaceManager() {
}
}