Построение кривой Безье n-ого порядка

 
 
 
Сообщения:1
Всем мир.Я новенькая в программировании на Java и у меня есть задача построить простую аппликацию для отображения кривых безье , однако в коде где-то сделано упущение и кривая при любом рисовании устремляется в начало координат.Может кто нибудь знает в чём загвоздка?

	
	
	private static int fact(int n) {
							int fact = 1;
							for(int i = 1; i <= n;i++) {
								fact *= i;
							}
							return fact;
						}

	
	private static double bernstein(double t,int n,int i) {
		return (fact(n)/(fact(i)*fact(n-i)))*Math.pow(1-t, n-i)*Math.pow(t, i);
	}


	JButton btnNewButton = new JButton("New button");
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				int pointCount;
				
				pointCount = (int) spinner.getValue();
				if (pointCount>8) {
					warning.setVisible(true);
				}else {warning.setVisible(false);}
				
				
				
				
				Point[] points = getPoints(pointCount);	
				
				 drawScene(points);
			}
			
			
			private  Point[] getPoints(int pointCount) {
				Random val = new Random();
				Point[] points = new Point[pointCount];
				for(int i=0;i<pointCount;i++) {
					points[i] = new Point(val.nextInt(panel.getWidth()), val.nextInt(panel.getHeight()));
				}
				return points;
			}
			
			
			private void drawScene(Point[] points) {
				int pWidth = panel.getWidth();
				int pHeight = panel.getHeight();
				Graphics g = panel.getGraphics();
				int pointCount = points.length;
				g.setColor(Color.WHITE);
				g.fillRect(0,0, pWidth, pHeight);
				for (int i = 0; i < pointCount; i++) {
					if(i+1<pointCount) {
						g.setColor(Color.BLUE);
						g.drawLine(points[i].x, points[i].y, points[i+1].x, points[i+1].y);
					}
					g.setColor(Color.red);
					g.drawString(String.valueOf(i+1), points[i].x, points[i].y-6);
					g.drawOval(points[i].x, points[i].y, 3, 3);
				}
				if(pointCount>1) {
					for(double t=0;t<=1;t+=0.001) {
						besierCurve(t,points);
					}				
								
				}
			};
		
			
			private void besierCurve(double t , Point[] points) {
				
				Graphics g = panel.getGraphics();
				int pointCount = points.length; 
				double bPoly[] = new double[pointCount];
				double sumX=0 ;
				double sumY=0;
				int x , y;
				
				if(pointCount>=3) {
				for(int i = 0;i<pointCount;i++) {
					bPoly[i] = bernstein(t,pointCount,i);
				
					sumX += bPoly[i] * points[i].x;
					sumY += bPoly[i] * points[i].y;
					
				}
		
				x=(int) Math.round(sumX);
				y=(int) Math.round(sumY);
				g.drawLine(x , y , x , y);
				
				
				
				
				
			}
Изменен:21 ноя 2019 13:08
 
Модераторы:frymock
Сейчас эту тему просматривают:Нет