Java сглаживание координат для произвольно сгенерированной фигуры - PullRequest
0 голосов
/ 12 апреля 2020

Я не слишком уверен, как сформулировать вопрос. Но я пытаюсь создать программу для моего задания, где система строит случайную форму на основе параметров и размещает текст (в соответствии с большим количеством параметров), чтобы заполнить область. Вроде как визуальные стихотворения типа вещей. Я использую 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());
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...