package WheelOfFortune;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.scene.Group;
import javafx.scene.GroupBuilder;
import javafx.scene.Node;
import javafx.scene.layout.Region;
import javafx.scene.paint.Color;
import javafx.scene.shape.Arc;
import javafx.scene.shape.ArcBuilder;
import javafx.scene.shape.ArcType;
import javafx.scene.shape.Circle;
import javafx.scene.shape.CircleBuilder;
import javafx.scene.shape.Rectangle;
import javafx.scene.shape.RectangleBuilder;
import javafx.scene.text.Text;
import javafx.scene.text.TextBuilder;
import javafx.scene.transform.Rotate;
import javafx.scene.transform.RotateBuilder;
import javafx.scene.transform.Transform;
import javafx.scene.transform.Translate;
import javafx.scene.transform.TranslateBuilder;
public class Wheel extends Region {
private int n;
private int radius;
private int cx;
private int cy;
private Color[] colors;
private SimpleDoubleProperty angle = new SimpleDoubleProperty();
private SimpleDoubleProperty rotAngle = new SimpleDoubleProperty();
public Node composeNode() {
n = 32;
radius = 100;
cx = radius;
cy = radius;
angle.set(360 / n);
double extraTurns = 2;
colors = new Color[] { Color.RED, Color.LIME, Color.BLUE, Color.YELLOW,
Color.ORANGE, Color.CYAN };
Rectangle selector = RectangleBuilder.create().x(radius * 2 - 10)
.y(radius).width(30).height(10).fill(Color.BLACK).build();
List<Arc> disc = new ArrayList<>();
for (int j = 1; j <= n; j++) {
disc.add(ArcBuilder.create().radiusX(radius * 2)
.radiusY(radius * 2).startAngle(j * angle.get())
.length(angle.get()).fill(colors[j % colors.length])
.transforms(Translate.translate(-radius, -radius))
.type(ArcType.CHORD).build());
}
Circle border = CircleBuilder.create().radius(radius)
.stroke(Color.GRAY).strokeWidth(2).build();
Circle glass = CircleBuilder.create().radius(radius - 25)
.fill(Color.WHITE).opacity(0.3).build();
Star star = new Star();
star.setRin(radius / 4);
star.setRout(radius / 2);
star.setPoints(5);
star.setStartAngle(18);
star.setFill(Color.YELLOW);
List<Text> numbers = new ArrayList<>();
for (int i = 1; i <= n; i++) {
numbers.add(TextBuilder
.create()
.transforms(Transform.rotate(i * angle.get(), 0, 0),
Translate.translate(radius - 20, 0)).text(i + "")
.build());
}
Rotate rot = RotateBuilder.create().pivotX(cx).pivotY(cy).build();
rot.angleProperty().bind(rotAngle);
Translate trans = TranslateBuilder.create().x(cx).y(cy).build();
Group base = GroupBuilder.create().transforms(rot, trans)
.children(numbers).children(disc).children(border, glass, star)
.build();
return GroupBuilder.create().children(selector, base).build();
}
public void run() {
Random fortune = new Random(System.currentTimeMillis());
int chosen = fortune.nextInt(n);
// rotAngle = [1.. extraTurns*360+ chosen*angle] dur 200 * n;
}
/*
* var wheel = Wheel{};
*
* Frame{ visible: true content: Canvas { content: [ wheel, View {
* content:Button { text: "Go" action: operation() { wheel.run(); } } } ] }
* }
*/
}