При рисовании графика стирается его половина,как это можно исправить?

164
05 декабря 2021, 17:00

создаю график прямой лемниската Бернулли в java, она должна выглядеть так:

При рисовании рисуется весь график, но потом пропадает правая его часть, как это можно исправить?

import java.awt.*; 
 
class FillPolygonCanvas extends Canvas{ 
    public int x0 = 200; 
    public int y0 = 200; 
    public int a = 100; 
    public double y; 
    public double x; 
    public double r; 
    public double fi=-(Math.PI/4); 
    public void paint(Graphics g){ 
       Polygon poly = new Polygon(); 
       Polygon poly1 = new Polygon(); 
        while (fi<=Math.PI/4){ 
            r=a*Math.sqrt(2*Math.cos(2*fi)); 
            x=r*Math.cos(fi); 
            y=r*Math.sin(fi); 
            if(fi==-Math.PI/4){ 
                poly1.addPoint(x0,y0); 
            }else{ 
                poly1.addPoint(x0+(int)x,y0-(int)y); 
            } 
            fi=fi+0.0001; 
            g.drawPolygon(poly1); 
        } 
 
 
        fi=3*Math.PI/4+0.0001; 
       while (fi<=5*Math.PI/(4-0.0001)){   //left 
           r=a*Math.sqrt(2*Math.cos(2*fi)); 
           x=r*Math.cos(fi); 
           y=r*Math.sin(fi); 
           if(fi==3*Math.PI/4+0.0001){ 
               poly.addPoint(x0,y0); 
           }else{ 
               poly.addPoint(x0+(int)x,y0-(int)y); 
           } 
           fi=fi+0.0001; 
 
       } 
        g.drawPolygon(poly); 
 
 
 
    } 
} 
class MyFrame extends Frame{ 
    public MyFrame(){ 
        super("Graphics"); 
//        setLayout(new GridLayout(3,3)); 
        add(new FillPolygonCanvas()); 
        setSize(500,300); 
        setVisible(true); 
 
    } 
 
} 
public class Main{ 
    public static void main(String[] args) { 
        Frame f = new MyFrame(); 
    } 
}

Answer 1

drawPolygon вынесите за цикл while в первом цикле.

 while (fi<=Math.PI/4){
        r=a*Math.sqrt(2*Math.cos(2*fi));
        x=r*Math.cos(fi);
        y=r*Math.sin(fi);
        if(fi==-Math.PI/4){
            poly1.addPoint(x0,y0);
        }else{
            poly1.addPoint(x0+(int)x,y0-(int)y);
        }
        fi=fi+0.0001;
    }
    g.drawPolygon(poly1);
READ ALSO
Как анимировать canvas?

Как анимировать canvas?

По нажатию на кнопку квадрат изменяет позициюКак сделать это перемещение плавным? Может как то с помощью requestAnimationFrame() или setInterval()? Сам код:

105
Как осуществить циклический сдвиг?

Как осуществить циклический сдвиг?

Задано 4 байтовое число, с 10 по 4 биты сдвинуть влево на 3 разряда

164