Java tutorial
/* * Copyright 2015 MovingBlocks * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.terasology.polyworld.sampling; import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.geom.Line2D; import java.math.RoundingMode; import java.util.List; import javax.swing.JFrame; import javax.swing.JPanel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.terasology.math.geom.Rect2f; import org.terasology.math.geom.Vector2f; import org.terasology.math.geom.Vector2i; import com.google.common.math.DoubleMath; public final class PoissonDiscTestView { private static float graphDensity = 10f; private static final Logger logger = LoggerFactory.getLogger(PoissonDiscTestView.class); private PoissonDiscTestView() { // no instances } public static void main(String[] args) { // int rows = DoubleMath.roundToInt(area.height() / cellSize, RoundingMode.HALF_UP); // int cols = DoubleMath.roundToInt(area.width() / cellSize, RoundingMode.HALF_UP); Rect2f area = Rect2f.createFromMinAndSize(30, 10, 512, 256); int numSites = DoubleMath.roundToInt(area.area() * graphDensity / 1000, RoundingMode.HALF_UP); logger.info("START GRID"); PoissonDiscSampling sampling = new PoissonDiscSampling(); List<Vector2f> points = sampling.create(area, numSites); logger.info("END GRID"); System.out.println("SHOULD BE: " + numSites); System.out.println("REALITY : " + points.size()); JFrame frame = new JFrame(); frame.setSize(1200, 600); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(new JPanel() { private static final long serialVersionUID = 7926239205123946814L; @Override protected void paintComponent(Graphics g1) { super.paintComponent(g1); int scale = 2; Graphics2D g = (Graphics2D) g1; g.setColor(Color.GRAY); g.setStroke(new BasicStroke(0f)); g.setTransform(AffineTransform.getScaleInstance(scale, scale)); drawDebug(area, g); g.setColor(Color.BLACK); g.setStroke(new BasicStroke(1f)); for (Vector2f pt : points) { g.draw(new Line2D.Float(pt.getX(), pt.getY(), pt.getX(), pt.getY())); } } private void drawDebug(Rect2f bounds, Graphics2D g) { g.setColor(Color.LIGHT_GRAY); Vector2i dims = sampling.getGridDimensions(bounds, numSites); int cols = dims.getX(); int rows = dims.getY(); float cellWidth = (float) bounds.width() / cols; float cellHeight = (float) bounds.height() / rows; g.translate(bounds.minX(), bounds.minY()); for (int i = 0; i <= cols; i++) { g.drawLine((int) (i * cellWidth), 0, (int) (i * cellWidth), (int) bounds.height()); } for (int i = 0; i <= rows; i++) { g.drawLine(0, (int) (i * cellHeight), (int) bounds.width(), (int) (i * cellHeight)); } g.translate(-bounds.minX(), -bounds.minY()); } }); frame.setVisible(true); } }