You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Matlab中计算闭合曲线(多边形)上各点的曲率

Calculating Curvature for Your Closed Discrete Curve

Alright, let's work through computing the curvature at each point of your closed curve. Since we're dealing with discrete (not continuous) points, we'll use numerical differentiation to approximate the derivatives needed for the curvature formula.

Background: Curvature Formula for Parametric Curves

For a parametric curve defined by (x(t)) and (y(t)), the curvature (k) at any point is given by:
[
k = \frac{\left| x'(t) y''(t) - x''(t) y'(t) \right|}{\left( x'(t)^2 + y'(t)^2 \right)^{3/2}}
]
Here, (x'(t)) and (y'(t)) are first derivatives, (x''(t)) and (y''(t)) are second derivatives with respect to the parameter (t) (we'll use the index of each point as our discrete parameter).

Step-by-Step Matlab Implementation

Below is a complete script that takes your point set, computes curvature at each point, and visualizes the results with color-coded points to highlight curvature variation:

% Your original closed curve point set
x = [1.34, 0.92, 0.68, 0.25, -0.06, -0.34, -0.49, -0.72, -0.79, -0.94, -1.35, -0.35, 0.54, 0.68, 0.84, 1.20, 1.23, 1.32, 1.34];
y = [0.30, 0.43, 0.90, 1.40, 1.13, 1.08, 1.14, 1.23, 0.52, 0.21, -0.20, -0.73, -0.73, -0.82, -0.71, -0.76, -0.46, -0.13, 0.30];

n = length(x);
dt = 1; % Discrete step size (using point index as the parameter)

% Compute first derivatives with central difference (handles closed curve boundaries)
dx = (circshift(x, -1) - circshift(x, 1)) / (2*dt);
dy = (circshift(y, -1) - circshift(y, 1)) / (2*dt);

% Compute second derivatives with central difference
ddx = (circshift(x, -1) - 2*x + circshift(x, 1)) / (dt^2);
ddy = (circshift(y, -1) - 2*y + circshift(y, 1)) / (dt^2);

% Calculate curvature using the parametric formula
numerator = abs(dx .* ddy - ddx .* dy);
denominator = (dx.^2 + dy.^2).^(3/2);
% Safeguard against division by zero (set curvature to 0 if derivative magnitude is zero)
curvature = numerator ./ denominator;
curvature(denominator == 0) = 0;

% Visualize the curve with curvature color mapping
figure(1)
hold on
plot(x, y, 'k', 'LineWidth', 1);
scatter(x, y, 50, curvature, 'filled');
xlim([-2 2]);
ylim([-2 2]);
axis equal
colorbar;
title('Closed Curve with Curvature Color Coding');
xlabel('x');
ylabel('y');
hold off

% Print curvature values for each point
disp('Curvature values corresponding to each input point:');
disp(curvature);

Key Details Explained

  • Closed Curve Handling: We use circshift to shift the point arrays, so the first point's "previous" point is the last one, and the last point's "next" point is the first one—this preserves the closed nature of your curve.
  • Central Difference: This method gives a more accurate derivative approximation than forward/backward differences for interior points, and works seamlessly for closed boundaries here.
  • Error Safeguard: The check for zero denominator prevents division errors if any point has a zero-magnitude first derivative (unlikely in your dataset, but a good practice).

Notes for Improved Accuracy

If you want even more precise curvature values:

  • Fit a smooth closed spline to your points first (using csape with periodic boundary conditions) and compute derivatives from the spline—this reduces noise from discrete point spacing.
  • Adjust the dt value if you have actual spatial spacing information between consecutive points (right now we assume equal parameter spacing between points).

内容的提问来源于stack exchange,提问作者jarhead

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:32:54