截图如下,拖动黄色控制点可以改变曲线:
二次曲线代码:
<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript">
var start = { x: 10, y: 150 }, ctl = { x: 100, y: 50 }, end = { x: 200, y: 150 };
var mouseIndex = -1;
function draw() {
var ctx = document.getElementById("canvas").getContext("2d");
ctx.clearRect(0, 0, 600, 500);
ctx.lineWidth = 1;
ctx.strokeStyle = "#000000";
ctx.beginPath();
//辅助连线
ctx.moveTo(start.x, start.y);
ctx.lineTo(ctl.x, ctl.y);
ctx.lineTo(end.x, end.y);
ctx.stroke();
//曲线
ctx.beginPath();
ctx.strokeStyle = "#ff0000";
ctx.lineWidth = 4;
ctx.moveTo(start.x, start.y);
ctx.quadraticCurveTo(ctl.x, ctl.y, end.x, end.y);
ctx.stroke();
//控制点
ctx.beginPath();
ctx.strokeStyle = "#000000";
ctx.fillStyle = mouseIndex == 0 ? "rgba(250,250,0,1)" : "rgba(210,210,0,1)";
ctx.lineWidth = 2;
ctx.arc(start.x, start.y, 7, 0, 2 * Math.PI, false);
ctx.fill();
ctx.stroke();
ctx.beginPath();
ctx.fillStyle = mouseIndex == 1 ? "rgba(250,250,0,1)" : "rgba(210,210,0,1)";
ctx.arc(ctl.x, ctl.y, 7, 0, 2 * Math.PI, false);
ctx.fill();
ctx.stroke();
ctx.beginPath();
ctx.fillStyle = mouseIndex == 2 ? "rgba(250,250,0,1)" : "rgba(210,210,0,1)";
ctx.arc(end.x, end.y, 7, 0, 2 * Math.PI, false);
ctx.fill();
ctx.stroke();
}
function getRect(point) {
return { x: point.x - 8, y: point.y - 8, width: 16, height: 16 };
}
function contains(rect, point) {
return point.x > rect.x && point.x < rect.x + rect.width && point.y > rect.y && point.y < rect.y + rect.height;
}
function handleMove(event) {
if (window.mousedown) {
if (mouseIndex == 0) {
start = { x: event.offsetX, y: event.offsetY };
} else if (mouseIndex == 1) {
ctl = { x: event.offsetX, y: event.offsetY };
} else if (mouseIndex == 2) {
end = { x: event.offsetX, y: event.offsetY };
}
draw();
} else {
var newMouseIndex = mouseIndex;
if (contains(getRect(start), { x: event.offsetX, y: event.offsetY })) {
newMouseIndex = 0;
} else if (contains(getRect(ctl), { x: event.offsetX, y: event.offsetY })) {
newMouseIndex = 1;
} else if (contains(getRect(end), { x: event.offsetX, y: event.offsetY })) {
newMouseIndex = 2;
} else {
newMouseIndex = -1;
}
if (newMouseIndex !== mouseIndex) {
mouseIndex = newMouseIndex;
draw();
}
}
}
</script>
</head>
<body onload="draw()" onmousedown="window.mousedown=1" onmouseup="window.mousedown=0">
<canvas id="canvas" width="600" height="500" onmousemove="handleMove(event)"></canvas>
</body>
</html>
贝塞尔曲线:
<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript">
var start = { x: 10, y: 150 }, ctl = { x: 100, y: 50 }, ctl2={x:200,y:200},end = { x: 300, y: 150 };
var mouseIndex = -1;
function draw() {
var ctx = document.getElementById("canvas").getContext("2d");
ctx.clearRect(0, 0, 600, 500);
ctx.lineWidth = 1;
ctx.strokeStyle = "#000000";
ctx.beginPath();
//辅助连线
ctx.moveTo(start.x, start.y);
ctx.lineTo(ctl.x, ctl.y);
ctx.lineTo(ctl2.x, ctl2.y);
ctx.lineTo(end.x, end.y);
ctx.stroke();
//曲线
ctx.beginPath();
ctx.strokeStyle = "#ff0000";
ctx.lineWidth = 4;
ctx.moveTo(start.x, start.y);
ctx.bezierCurveTo(ctl.x, ctl.y, ctl2.x,ctl2.y,end.x, end.y);
ctx.stroke();
//控制点
ctx.beginPath();
ctx.strokeStyle = "#000000";
ctx.fillStyle = mouseIndex == 0 ? "rgba(250,250,0,1)" : "rgba(210,210,0,1)";
ctx.lineWidth = 2;
ctx.arc(start.x, start.y, 7, 0, 2 * Math.PI, false);
ctx.fill();
ctx.stroke();
ctx.beginPath();
ctx.fillStyle = mouseIndex == 1 ? "rgba(250,250,0,1)" : "rgba(210,210,0,1)";
ctx.arc(ctl.x, ctl.y, 7, 0, 2 * Math.PI, false);
ctx.fill();
ctx.stroke();
ctx.beginPath();
ctx.fillStyle = mouseIndex == 2 ? "rgba(250,250,0,1)" : "rgba(210,210,0,1)";
ctx.arc(ctl2.x, ctl2.y, 7, 0, 2 * Math.PI, false);
ctx.fill();
ctx.stroke();
ctx.beginPath();
ctx.fillStyle = mouseIndex == 3 ? "rgba(250,250,0,1)" : "rgba(210,210,0,1)";
ctx.arc(end.x, end.y, 7, 0, 2 * Math.PI, false);
ctx.fill();
ctx.stroke();
}
function getRect(point) {
return { x: point.x - 8, y: point.y - 8, width: 16, height: 16 };
}
function contains(rect, point) {
return point.x > rect.x && point.x < rect.x + rect.width && point.y > rect.y && point.y < rect.y + rect.height;
}
function handleMove(event) {
if (window.mousedown) {
if (mouseIndex == 0) {
start = { x: event.offsetX, y: event.offsetY };
} else if (mouseIndex == 1) {
ctl = { x: event.offsetX, y: event.offsetY };
} else if (mouseIndex == 2) {
ctl2 = { x: event.offsetX, y: event.offsetY };
}else if (mouseIndex == 3) {
end = { x: event.offsetX, y: event.offsetY };
}
draw();
} else {
var newMouseIndex = mouseIndex;
if (contains(getRect(start), { x: event.offsetX, y: event.offsetY })) {
newMouseIndex = 0;
} else if (contains(getRect(ctl), { x: event.offsetX, y: event.offsetY })) {
newMouseIndex = 1;
} else if (contains(getRect(ctl2), { x: event.offsetX, y: event.offsetY })) {
newMouseIndex = 2;
} else if (contains(getRect(end), { x: event.offsetX, y: event.offsetY })) {
newMouseIndex = 3;
}else {
newMouseIndex = -1;
}
if (newMouseIndex !== mouseIndex) {
mouseIndex = newMouseIndex;
draw();
}
}
}
</script>
</head>
<body onload="draw()" onmousedown="window.mousedown=1" onmouseup="window.mousedown=0">
<canvas id="canvas" width="600" height="500" onmousemove="handleMove(event)"></canvas>
</body>
</html>
- 大小: 8.6 KB
分享到:
相关推荐
1. **控制点的影响**:通过调整控制点的位置,可以改变二次贝塞尔曲线的形状和走向。控制点与起点或终点距离的远近会影响曲线的弯曲程度。 2. **参数 t 的作用**:参数 \( t \) 决定了曲线上哪个点被计算出来。当 \...
**二次贝塞尔曲线算法详解** 二次贝塞尔曲线是计算机图形学中常用的一种平滑曲线生成方法,它由三个点定义:起始点P0、结束点P2以及一个控制点P1。通过这三个点,我们可以计算出一系列点,这些点连接起来形成的曲线...
二次贝塞尔曲线是一种由两个控制点和一个起始点及结束点定义的参数曲线。这种曲线在图形设计、计算机图形学和游戏开发等领域广泛使用,因为它可以提供灵活的形状控制。二次贝塞尔曲线的数学表达式如下: \[ B(t) = ...
java 二次贝塞尔曲线算法,根据起点、终点和控制点输出点集合
用TC生存二次贝塞尔曲线,其实稍微改一下就可以实现三次贝塞尔曲线的了。
在二维空间中,贝塞尔曲线由四个点(两个端点和两个控制点)定义,而在三维空间中,这个数字会增加到七个。贝塞尔曲线的一个重要特性是,通过改变控制点的位置,可以直接影响曲线的形状和弯曲程度,这为设计师提供了...
综上所述,这个"BezierCurve 贝塞尔曲线计算 c++源码"项目提供了C++实现的贝塞尔曲线算法,支持二维和三维数据,适合学习者了解和实践贝塞尔曲线的计算方法,也可以作为其他软件开发中需要用到曲线功能的参考。
在OpenGL中,B样条、贝塞尔曲线和贝塞尔曲面是重要的数学工具,用于构建和绘制平滑连续的曲线和曲面。 B样条(B-Spline)是一种灵活的非均匀有理B样条(NURBS)的基础。它们通过控制点来定义,并具有局部修改的特性...
路径数据由一系列命令和参数组成,其中`C`(对于三次贝塞尔曲线)或`Q`(对于二次贝塞尔曲线)命令用于定义控制点和结束点。 例如,一个简单的二次贝塞尔曲线可以这样表示: ```javascript var path = document....
如线性不等价性(改变控制点的位置不会改变曲线的形状)、平滑性(曲线在控制点处的切线可通过相邻控制点确定)和可分解性(任何三次贝塞尔曲线都可以拆分成两个二次贝塞尔曲线),对于理解和绘制更复杂的图形路径都...
根据控制点的数量,贝塞尔曲线可以分为线性贝塞尔曲线(两个控制点)、二次贝塞尔曲线(三个控制点)和三次贝塞尔曲线(四个控制点)。更复杂的曲线可以通过连接多个贝塞尔曲线段来实现。 在Delphi中,使用...
3. **统一方法**:贝塞尔曲线的表示方式可以统一处理不同类型的曲线,如直线、二次曲线(抛物线、椭圆部分)和三次曲线。这意味着,无论曲线的复杂程度如何,处理和编辑的方法保持一致,减少了学习曲线,并提高了...
二次贝塞尔曲线是贝塞尔曲线家族中的一种,适用于构建各种复杂的动画效果和游戏场景。这次我们将深入探讨Unity3D中的二次贝塞尔曲线,并通过提供的工程源码进行实践。 首先,我们需要理解什么是贝塞尔曲线。贝塞尔...
这是一份C语言版本的bezier曲线(贝塞尔曲线)绘制代码,实现了二次和三次bezier曲线的绘制,可用于一系列给定的离散点的曲线平滑。此代码封装成函数,可以直接调用。脚本里边有参数和代码的注释,可供使用者学习和...
对于二次贝塞尔曲线(两个控制点和一个起点与终点),参数方程为: B(t) = (1 - t)^2 * P0 + 2 * (1 - t) * t * P1 + t^2 * P2 而对于三次贝塞尔曲线(三个控制点和一个起点与终点),参数方程为: B(t) = (1 - t)^...
一阶贝塞尔曲线是线性,二阶是二次曲线,而高阶曲线则可以构建出更复杂的形状。对于n阶贝塞尔曲线,需要n+1个控制点来定义。这些曲线的特性在于它们通过首尾两个控制点,并且随着阶数的增加,曲线更好地逼近中间的...
在Android中,`Path`类提供了`quadTo()`(二次贝塞尔曲线)和`cubicTo()`(三次贝塞尔曲线)方法来绘制这些曲线。 心形通常由两个相互连接的二次或三次贝塞尔曲线构成,每个曲线代表心形的一半。为了构建这样的心形...
2. **二次贝塞尔曲线**:由三个点P0、P1和P2构成,其中P0和P2是端点,P1是控制点。二次贝塞尔曲线可以通过改变控制点的位置来控制曲线的弯曲程度。 3. **三次贝塞尔曲线**:最常用的一种,由四个点P0、P1、P2和P3...
应用贝塞尔曲线与NSTimer结合使用 制作动态进度条。 简单实用,易懂,易学习 贝塞尔一次二次曲线的简单绘制,应用。 供各位童鞋学习使用分享 Q:305814832 email:ioszhaoyi@163.com
2. **二次方贝塞尔曲线**:包含三个控制点P0、P1和P2。P0和P2是端点,P1则是控制曲线曲率的控制点。这条曲线的数学表达式为: \[ B(t) = (1 - t)^2 P_0 + 2(1 - t)t P_1 + t^2 P_2,\quad t \in [0,1] \] 3. **三...