在 Java 中绘制贝塞尔曲线
Drawing bezier curve in Java
我需要创建一个简单的 Java 程序,通过任意数量的点逐个像素地绘制贝塞尔曲线。目前,一切似乎都很好,除了曲线总是在 x=0 y=0 坐标处结束。
截图 1
截图 2
我需要它在最后一点结束。我今天脑子不太灵,所以我正在寻求帮助。
这是我的:
private void drawScene(){
precision = Float.parseFloat(this.jTextField4.getText());
//Clears the screen and draws X and Y lines
g.setColor(Color.white);
g.fillRect(0, 0, pWidth, pHeight);
g.setColor(Color.gray);
g.drawLine(0, offsetY, pWidth, offsetY);
g.drawLine(offsetX, 0, offsetX, pHeight);
//Drawing the points
if(pointCount > 0){
for(int i = 0;i<pointCount;i++){
g.setColor(Color.red);
g.drawString(String.valueOf(i+1), points[i].x + offsetX, points[i].y - 6 + offsetY);
g.drawOval(points[i].x + offsetX, points[i].y - 6 + offsetY, 3, 3);
}
}
//Drawing the curve
if(pointCount > 1){
float t = 0;
while(t <= 1){
g.setColor(Color.gray);
this.besierCurvePixel(t);
t += precision;
}
}
}
//Factorial
private static int fact(int n) {
int fact = 1;
for (int i = 1; i <= n; i++) {
fact *= i;
}
return fact;
}
//Bernstein polynomial
private static double bernstein(float t, int n, int i){
return (fact(n) / (fact(i) * fact(n-i))) * Math.pow(1-t, n-i) * Math.pow(t, i);
}
private void besierCurvePixel(float t){
double bPoly[] = new double[pointCount];
for(int i = 0; i < pointCount; i++){
bPoly[i] = bernstein(t, pointCount, i+1);
}
double sumX = 0;
double sumY = 0;
for(int i = 0; i < pointCount; i++){
sumX += bPoly[i] * points[i].x;
sumY += bPoly[i] * points[i].y;
}
int x, y;
x = (int) Math.round(sumX);
y = (int) Math.round(sumY);
g.drawLine(x + offsetX, y + offsetY, x + offsetX, y + offsetY);
}
这是加点的方法(pointCount初始为0):
points[pointCount] = new Point();
points[pointCount].x = evt.getX() - this.offsetX;
points[pointCount].y = evt.getY() - this.offsetY;
pointCount++;
this.drawScene();
赖,
"pointcount" 在哪里设置(以及什么)?
您是否尝试过单步执行您的代码,看看为什么它在到达最后一点后继续?
是否有可能您正在额外执行循环 1,这就是为什么最后一个点的目标设置为 (0,0) 的原因?
您可以设置应用程序到达每个点的步数吗?
希望我能提出要点来帮助您找到答案
*编辑:如果我不得不猜测 - 你不小心向点[]添加了一个额外的点(0,0);这是我看到它在最后一点之后转到 (0,0) 的地方:
for(int i = 0; i < pointCount; i++){
sumX += bPoly[i] * **points[i]**.x;
sumY += bPoly[i] * **points[i]**.y;
}
编辑:很高兴您能够修复它,希望我能帮助您找到该问题。祝你未来好运!
问题出在这里
for(int i = 0; i < pointCount; i++){
bPoly[i] = bernstein(t, pointCount, i+1);
}
bernstein 方法中的第二个参数不正确。基本上如果我有3分,应该是2分而不是3分;
bPoly[i] = bernstein(t, pointCount-1, i+1);
我需要创建一个简单的 Java 程序,通过任意数量的点逐个像素地绘制贝塞尔曲线。目前,一切似乎都很好,除了曲线总是在 x=0 y=0 坐标处结束。
截图 1
截图 2
我需要它在最后一点结束。我今天脑子不太灵,所以我正在寻求帮助。
这是我的:
private void drawScene(){
precision = Float.parseFloat(this.jTextField4.getText());
//Clears the screen and draws X and Y lines
g.setColor(Color.white);
g.fillRect(0, 0, pWidth, pHeight);
g.setColor(Color.gray);
g.drawLine(0, offsetY, pWidth, offsetY);
g.drawLine(offsetX, 0, offsetX, pHeight);
//Drawing the points
if(pointCount > 0){
for(int i = 0;i<pointCount;i++){
g.setColor(Color.red);
g.drawString(String.valueOf(i+1), points[i].x + offsetX, points[i].y - 6 + offsetY);
g.drawOval(points[i].x + offsetX, points[i].y - 6 + offsetY, 3, 3);
}
}
//Drawing the curve
if(pointCount > 1){
float t = 0;
while(t <= 1){
g.setColor(Color.gray);
this.besierCurvePixel(t);
t += precision;
}
}
}
//Factorial
private static int fact(int n) {
int fact = 1;
for (int i = 1; i <= n; i++) {
fact *= i;
}
return fact;
}
//Bernstein polynomial
private static double bernstein(float t, int n, int i){
return (fact(n) / (fact(i) * fact(n-i))) * Math.pow(1-t, n-i) * Math.pow(t, i);
}
private void besierCurvePixel(float t){
double bPoly[] = new double[pointCount];
for(int i = 0; i < pointCount; i++){
bPoly[i] = bernstein(t, pointCount, i+1);
}
double sumX = 0;
double sumY = 0;
for(int i = 0; i < pointCount; i++){
sumX += bPoly[i] * points[i].x;
sumY += bPoly[i] * points[i].y;
}
int x, y;
x = (int) Math.round(sumX);
y = (int) Math.round(sumY);
g.drawLine(x + offsetX, y + offsetY, x + offsetX, y + offsetY);
}
这是加点的方法(pointCount初始为0):
points[pointCount] = new Point();
points[pointCount].x = evt.getX() - this.offsetX;
points[pointCount].y = evt.getY() - this.offsetY;
pointCount++;
this.drawScene();
赖, "pointcount" 在哪里设置(以及什么)? 您是否尝试过单步执行您的代码,看看为什么它在到达最后一点后继续? 是否有可能您正在额外执行循环 1,这就是为什么最后一个点的目标设置为 (0,0) 的原因? 您可以设置应用程序到达每个点的步数吗?
希望我能提出要点来帮助您找到答案
*编辑:如果我不得不猜测 - 你不小心向点[]添加了一个额外的点(0,0);这是我看到它在最后一点之后转到 (0,0) 的地方:
for(int i = 0; i < pointCount; i++){
sumX += bPoly[i] * **points[i]**.x;
sumY += bPoly[i] * **points[i]**.y;
}
编辑:很高兴您能够修复它,希望我能帮助您找到该问题。祝你未来好运!
问题出在这里
for(int i = 0; i < pointCount; i++){
bPoly[i] = bernstein(t, pointCount, i+1);
}
bernstein 方法中的第二个参数不正确。基本上如果我有3分,应该是2分而不是3分;
bPoly[i] = bernstein(t, pointCount-1, i+1);