java 贝塞尔曲线_在Java中绘制贝塞尔曲线

article/2025/11/9 17:49:06

我需要创建一个简单的Java程序,通过任意数量的点逐个像素地绘制贝塞尔曲线.此刻,一切似乎都没问题,只是曲线总是在x = 0 y = 0坐标处结束.

截图1

113951ee61f66c8b6af7b10d0c22569c.png

截图2

6c90a20b751ee8d8fe1245a41ca04efc.png

我需要它在最后一点结束.我的大脑今天工作不太好,所以我正在寻求帮助.

这是我有的:

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

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();

解决方法:

问题出在这里

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,swing,bezier

来源: https://codeday.me/bug/20190706/1397506.html


http://chatgpt.dhexx.cn/article/SsF7CB9C.shtml

相关文章

贝塞尔曲线(Bezier Curve)原理及公式推导

1. 定义 贝塞尔曲线(Bezier curve)&#xff0c;又称贝兹曲线或贝济埃曲线&#xff0c;是应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精确画出曲线&#xff0c;贝兹曲线由线段与节点组成&#xff0c;节点是可拖动的支点&#xff0c;线段像可伸缩的皮筋&#…

Bezier(贝塞尔)曲线小总结

在初学时&#xff0c;我发现Bezier曲线&#xff08;中文名贝塞尔曲线&#xff0c;想要了解历史发展等的可以看此百度百科&#xff1a;贝塞尔曲线_百度百科&#xff09;很难理解&#xff0c;故在此写了一篇自己的心得感悟。要理解它最重要的是理解Bernstein基函数。首先&#xf…

Bezier曲线原理—动态解释

Bezier曲线原理 贝塞尔曲线(Bzier curve)&#xff0c;又称贝兹曲线或贝济埃曲线&#xff0c;是应用于二维图形应用程序的数学曲线。一般的矢量图形软件通过它来精确画出曲线&#xff0c;贝兹曲线由线段与节点组成&#xff0c;节点是可拖动的支点&#xff0c;线段像可伸缩的皮…

正确的Bezier曲线的绘制

原文地址:http://blog.csdn.net/mylovestart/article/details/8434310 Bezier曲线是参数多项式曲线,它由一组控制多边形折线(控制多边形)的顶点唯一定义,在控制多边形的各顶点中,只有第一个和最后一个顶点在曲线上,其他的顶点则用以定义曲线的导数,阶次和形状 Bezier曲线的数…

根据Bezier曲线的定义公式实现Bezier曲线的绘制

Bezier曲线的定义公式 Pi是曲线上点的坐标&#xff08;x,y,(z0)&#xff09;&#xff0c; Bi,n(t)伯恩斯坦公式&#xff0c;绘制Bezier曲线的第一种方法是根据这个公式来绘制。首先看看绘制的效果&#xff1a; &#xff08;1&#xff09;计算定义中多项式的值 首先要求伯恩斯…

Bezier曲线描述

Bezier曲线 1.Bezier曲线的定义 当用曲线段拟合曲线f(x)时&#xff0c;可以把曲线表示为许多小线段φi(x)之和&#xff0c;其中φi(x)称为基&#xff08;混合&#xff09;函数。 这些基&#xff08;混合&#xff09;函数是要用于计算和显示的。因此&#xff0c;经常选择多项式…

Bezier曲线的绘制

Bezier曲线是参数多项式曲线,它由一组控制多边形折线(控制多边形)的顶点唯一定义,在控制多边形的各顶点中,只有第一个和最后一个顶点在曲线上,其他的顶点则用以定义曲线的导数,阶次和形状 Bezier曲线的数学基础是能够在第一个和最后一个顶点之间进行插值的一个多项式混合函数,…

Bezier曲线的生成算法

Bezier曲线的生成方法 生成一条Bezier曲线实际上就是要求出曲线上的点。 1.根据定义直接生成Bezier曲线 定义&#xff1a; 其中 那么生成步骤为&#xff1a; ①首先给出 的递归计算式&#xff1a; ②&#xff1a;将表示成分量形式 由于的计算量大&#xff0c;算法效率不高…

bezier曲线解析与代码(c++)

前言&#xff1a; 作为rhino重度用户&#xff0c;我对于nurbs建模早有耳闻&#xff0c;但对于何为nurbs却不得其解。最近借上《计算机辅助设计》课程的机会&#xff0c;对此作了一些深入的学习&#xff0c;于是在此记录一下一些课程笔记和课后思考。了解nurbs&#xff0c;主要对…

Bezier曲线构造

Bezier曲线构造 曲线公式 曲 线 &#xff1a; C ( u ) ∑ i 0 n B n , i ( u ) P i 基 函 数 &#xff1a; B n , i n ! i ! ( n − i ) ! u i ( 1 − u ) n − i 曲线&#xff1a;C(u) \sum^n_{i0}B_{n,i}(u)P_i\\ 基函数&#xff1a;B_{n,i}\frac{n!}{i!(n-i)!}u^i(1-u)…

java版 贝塞尔曲线算法

public void test() {CvPoint controlPoint[] new CvPoint[4];controlPoint[0] new CvPoint(50, 60); //起点controlPoint[1] new CvPoint(130, 200); //控制点controlPoint[2] new CvPoint(300, 360); //控制点controlPoint[3] new CvPoint(400, 600); //终点int n cont…

Bezier曲线原理及实现代码(c++)

http://devres.zoomquiet.io/data/20110728232822/index.html Bezier曲线原理及实现代码&#xff08;c&#xff09; 一、原理&#xff1a; 贝塞尔曲线于1962年&#xff0c;由法国工程师皮埃尔贝塞尔&#xff08;Pierre Bzier&#xff09;所广泛发表&#xff0c;他运用贝塞尔曲线…

用Java实现可交互的贝塞尔曲线(Bezier curve)

关于贝塞尔曲线的详细数学原理及公式可参考&#xff1a; 贝塞尔曲线_百度百科 我们来谈谈贝塞尔曲线 本文给出了一种用Java实现贝塞尔曲线的方法&#xff0c;并且可以用鼠标拖动改变锚点。 效果演示图&#xff1a; 这里引用百度百科给出的公式&#xff1a; 二次方公式 三次方…

Bezier曲线简介

Bezier曲线简介 Bezier曲线&#xff0c;又有人叫贝赛尔曲线&#xff0c;贝兹曲线&#xff0c;在计算机绘图中经常被用到&#xff0c;由于前些天事件要用到这个&#xff0c;所以就研究了下。 有了参考资料&#xff0c;其实也不是很复杂。 曲线的介绍&#xff08;转自维基百科,见…

Bezier曲线原理及其代码实现

Bezier曲线原理及实现代码&#xff08;c&#xff09; 一、原理&#xff1a; 贝塞尔曲线于1962年&#xff0c;由法国工程师皮埃尔?贝塞尔&#xff08;Pierre B?zier&#xff09;所广泛发表&#xff0c;他运用贝塞尔曲线来为汽车的主体进行设计。贝塞尔曲线最初由 Paul de Cast…

Bezier曲线及其性质

本文为Bezier曲线mooc教程学习笔记。 目录 Bezier曲线与曲面[1] Bezier曲线的背景[2] Bezier曲线[3] Bezier曲线详细定义[4] Bezier曲线举例[5] Bernstein 基函数性质[6] 贝塞尔曲线的性质[7] Bezier曲线的生成[8] Bezier曲线的拼接[9] Bezier曲线的升阶与降阶 Bezier曲线与曲面…

Bezier曲线原理

一、原理&#xff1a; 贝塞尔曲线于1962年&#xff0c;由法国工程师皮埃尔贝塞尔&#xff08;Pierre Bzier&#xff09;所广泛发表&#xff0c;他运用贝塞尔曲线来为汽车的主体进行设计。贝塞尔曲线最初由Paul de Casteljau 于1959年运用de Casteljau 算法开发&#xff0c;以稳…

如何将多张图片合成一个pdf?

如何将多张图片合成一个pdf&#xff1f;平时我们都喜欢将word或者ppt文件转换成pdf后再使用&#xff0c;除此之外&#xff0c;我们还会将多张图片合并转换成pdf文件&#xff0c;大家会用什么方法将图片合并成pdf呢&#xff1f;我相信有很多小伙伴会使用这个方法&#xff0c;先将…

怎么把四个图片合成一个图片?

怎么把四个图片合成一个图片&#xff1f;关于图片的合成&#xff0c;我们一般都会用到图片处理软件来进行。但是对于一些职场新人来说&#xff0c;他根本不会用一些专业的图片处理软件&#xff0c;那么这个问题对他来说就是非常棘手的。其实遇到这样的问题&#xff0c;新人朋友…

python将多张图片合并成一张图片

文章目录 说明&#xff1a;合并图片的三个过程1、参考原博主的&#xff1a;2、优化第一个数量问题&#xff1a;3、优化俩个问题&#xff08;数量不限性状按比例变小&#xff09;4、优化黑行高度问题5、合成图片不清晰问题&#xff1a;总结下&#xff1a; 说明&#xff1a; 今天…