要在原图上不覆盖绘画
时间: 2023-12-22 14:04:55 浏览: 25
要在原有的图形上绘制新的曲线而不覆盖原有的图形,可以使用 `hold on` 命令来保持当前的图形状态,然后在此基础上绘制新的曲线。具体来说,`hold on` 命令可以将 MATLAB 的图形窗口设置为保持当前图形状态,从而可以在原有的图形上绘制新的曲线,而不会影响原有的图形。示例代码如下:
```matlab
% 打开名为 "future" 的 figure,并绘制第一个曲线
figure('Name', 'future');
x = linspace(0, 2*pi, 100);
y1 = sin(x);
plot(x, y1);
% 在当前 figure 上绘制第二个曲线,不覆盖第一个曲线
hold on;
y2 = cos(x);
plot(x, y2);
```
在上面的代码中,我们首先在名为 "future" 的 figure 上绘制了第一个曲线。然后使用 `hold on` 命令将该 figure 的状态设置为保持当前图形状态,并在此基础上绘制了第二个曲线。这样就可以在原有的图形上绘制新的曲线而不覆盖原来的图形。
相关问题
怎么要在原图上不覆盖绘画在循环的情况下画future(1)再画future(2),第二个循环继续画future(1)怎么办
要在循环中绘制多个图形并不覆盖原有的图形,可以使用 `subplot` 函数将当前 figure 分成多个子图,然后在不同的子图中绘制不同的图形。使用 `subplot` 函数时,需要指定子图的行列数和当前子图的编号,例如 `subplot(2, 2, 1)` 表示将当前 figure 分成 2 行 2 列,当前子图的编号为 1。具体使用方法如下:
```matlab
% 打开名为 "future" 的 figure
figure('Name', 'future');
% 循环绘制多个图形
for i = 1:n
% 将当前 figure 分成 2 行 1 列,并切换到第一个子图
subplot(2, 1, 1);
x = linspace(0, 2*pi, 100);
y1 = sin(x);
plot(x, y1);
% 将当前 figure 分成 2 行 1 列,并切换到第二个子图
subplot(2, 1, 2);
y2 = cos(x);
plot(x, y2);
% 在绘制完第二个图形后,将图形状态设置为保持,不清除之前的图形
hold on;
end
```
在上面的代码中,我们使用 `subplot` 函数将当前 figure 分成 2 行 1 列,然后在循环中依次绘制第一个子图和第二个子图中的图形,并且在每次循环结束时使用 `hold on` 命令将图形状态设置为保持。
如果需要在每次循环中都绘制相同的图形,可以在循环外面先定义好图形,然后在循环中使用 `subplot` 函数切换到不同的子图中,例如:
```matlab
% 打开名为 "future" 的 figure,并定义待绘制的图形
figure('Name', 'future');
x = linspace(0, 2*pi, 100);
y1 = sin(x);
y2 = cos(x);
% 循环绘制多个图形
for i = 1:n
% 将当前 figure 分成 2 行 1 列,并切换到第一个子图
subplot(2, 1, 1);
plot(x, y1);
% 将当前 figure 分成 2 行 1 列,并切换到第二个子图
subplot(2, 1, 2);
plot(x, y2);
% 在绘制完第二个图形后,将图形状态设置为保持,不清除之前的图形
hold on;
end
```
在上面的代码中,我们首先在循环外面定义了待绘制的图形 `y1` 和 `y2`,然后在循环中使用 `subplot` 函数切换到不同的子图中,并分别绘制 `y1` 和 `y2`。每次循环都是在相同的图形上绘制,不会覆盖之前的图形。同时,在每次循环结束时使用 `hold on` 命令将图形状态设置为保持。
opencv最小二乘拟合直线并在图像上绘画C++
在 OpenCV 中,可以使用 `cv::fitLine` 函数来进行最小二乘拟合直线,并使用 `cv::line` 函数在图像上绘制出拟合直线。具体实现如下:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
// 加载图像
Mat image = imread("test.jpg", IMREAD_COLOR);
// 构造数据点
std::vector<Point2f> points;
points.emplace_back(50, 50);
points.emplace_back(100, 150);
points.emplace_back(150, 250);
points.emplace_back(200, 350);
points.emplace_back(250, 450);
// 计算拟合直线
Vec4f lineParams; // 存储直线参数
fitLine(points, lineParams, cv::DIST_L2, 0, 0.01, 0.01);
// 在图像上绘制直线
Point2f startPoint, endPoint;
startPoint.x = lineParams[2] - 100 * lineParams[0];
startPoint.y = lineParams[3] - 100 * lineParams[1];
endPoint.x = lineParams[2] + 100 * lineParams[0];
endPoint.y = lineParams[3] + 100 * lineParams[1];
line(image, startPoint, endPoint, Scalar(0, 0, 255), 2);
// 显示图像
imshow("image", image);
waitKey(0);
return 0;
}
```
在上面的代码中,`image` 是一个 `Mat` 类型的图像,表示待绘制直线的图像。`points` 是一个 `std::vector<Point2f>` 类型的数据,表示待拟合的点集。`fitLine` 函数的参数和上面的代码相同。`line` 函数的参数依次为:
- `image`: 待绘制直线的图像
- `startPoint`: 直线的起点,是一个 `Point2f` 类型的点。
- `endPoint`: 直线的终点,是一个 `Point2f` 类型的点。
- `Scalar(0, 0, 255)`: 直线的颜色,这里使用红色。
- `2`: 直线的粗细,这里使用 2。
最后,函数会显示图像,并等待用户按下任意键才会退出。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://img-home.csdnimg.cn/images/20210720083646.png)
![doc](https://img-home.csdnimg.cn/images/20210720083327.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)