Я не слишком уверен, как сформулировать вопрос. Но я пытаюсь создать программу для моего задания, где система строит случайную форму на основе параметров и размещает текст (в соответствии с большим количеством параметров), чтобы заполнить область. Вроде как визуальные стихотворения типа вещей. Я использую Java и свинг для создания форм.
В настоящее время я работаю над созданием фигуры, мой метод на данный момент таков. 1. случайным образом генерировать вершины (позже заменит некоторый параметр) 2. упорядочить вершины против часовой стрелки и 3. нарисовать линии между каждой вершиной. Однако сейчас я пытаюсь добавить параметр сглаживания, который я хочу сгладить форму в зависимости от значения. то, что я имею в виду, это то, что если параметр от 0 до 1, то 0 очень грубый и острый, в то время как 1 сделает форму намного более гладкой, без резких краев и т. д. и что-нибудь между тем, чтобы быть интенсивностью.
Я просто не очень уверен, как это сделать. Я думал о добавлении большего количества вершин с помощью линейной интерполяции и прибегании к списку, но если я найду середину двух точек, то она все равно будет на линии, не особо решая многое. Я также думал о пропуске каждого x количества вершин, но это просто упростило бы форму, не делая ее более гладкой, просто меньше spikey.
есть идеи? Я включил некоторые части своего кода ниже для построения фигур. Пожалуйста, не жарьте меня слишком сильно на моем коде, я просто пытаюсь заставить все это работать, прежде чем сделать его лучше. Кроме того, я никогда не делал никаких GUI связанных ранее. так что все это довольно ново для меня.
Public class myPanel extends JPanel {
private ArrayList<Vertex> vertices;
private ArrayList<Line> lines;
private Vertex centre;
public myPanel(Vertex centre){
vertices = new ArrayList<>();
lines = new ArrayList<>();
SetVertices(centre);
SortVertices();
SetLines();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponents(g);
for(Line l : lines){
l.draw(g);
}
}
private void SetVertices(Vertex v){
Random r = new Random();
var num = r.nextInt(1) + 10;
for(int i = 0; i <= num; i++){
var dx = (r.nextInt(400) + 100);
var dy = (r.nextInt(400) + 100);
vertices.add(new Vertex(dx,dy));
}
}
private void SortVertices(){
ArrayList<Vertex> newlist = new ArrayList<>();
var cx = 0; var cy = 0;
for(Vertex v : vertices){
cx += v.getX();
cy += v.getY();
}
cx /= vertices.size();
cy /= vertices.size();
while(!vertices.isEmpty()){
Vertex temp = vertices.get(0);
for(Vertex v : vertices){
var angleT = StrictMath.atan2(temp.getY() - cy, temp.getX() - cx);
var angleV = StrictMath.atan2(v.getY() - cy, v.getX() - cx);
if(angleV < angleT){
temp = v;
}
}
newlist.add(temp);
vertices.remove(temp);
}
for(int i = 0; i < newlist.size(); i++){
vertices.add(i, newlist.get(i));
}
}
public void AddLine(int x1, int y1, int x2, int y2){
lines.add(new Line(x1,y1,x2,y2));
repaint();
}
public void SetLines(){
for(int i = 0; i < vertices.size() - 1; i++){
AddLine(vertices.get(i).getX(), vertices.get(i).getY(), vertices.get(i + 1).getX(), vertices.get(i + 1).getY());
}
AddLine(vertices.get(vertices.size()-1).getX(), vertices.get(vertices.size()-1).getY(), vertices.get(0).getX(), vertices.get(0).getY());
}
}