QT总结10-绘制箭头

在使用QT绘制时,有时候会需要用到箭头,这里写了关于如何计算箭头。

float x1 = begin.x();
float y1 = begin.y();
float x2 = end.x();
float y2 = end.y();

double angle = atan2(y2-y1,x2-x1);//计算线段的夹角
float l = 10;//箭头边的长度
float a = 0.5;//箭头与线段的夹角

float new_x1 = x2 - l * cos( angle - a);
float new_y1 = y2 - l * sin( angle - a);
float new_x2 = x2 - l * cos( angle + a);
float new_y2 = y2 - l * sin( angle + a);

绘制箭头需要三个顶点,将end和新计算出的两个点连起来就是一个箭头。

这里用一个图进行简单的描述,画的比较糙,凑活看。
在这里插入图片描述
A点是线段的终点(QT坐标系方向相反,倒着看就好),B,C是箭头的另外的两个端点。黄色的角代表线段与箭头的夹角,蓝色的角是线段的夹角。通过上面的计算公式可以得到箭头。

  • 4
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用C++和QT结合vtk绘制二维矢量箭头的例子: ```cpp #include <vtkSmartPointer.h> #include <vtkVectorText.h> #include <vtkPolyDataMapper.h> #include <vtkActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkArrowSource.h> #include <vtkGlyph3D.h> #include <vtkPolyData.h> #include <vtkIntArray.h> #include <vtkCellArray.h> #include <vtkPoints.h> #include <QApplication> #include <QWidget> #include <QVBoxLayout> #include <QPushButton> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget widget; QVBoxLayout *layout = new QVBoxLayout(&widget); QPushButton *button = new QPushButton("Draw", &widget); layout->addWidget(button); vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New(); vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New(); renderWindow->AddRenderer(renderer); widget.resize(400, 400); widget.show(); vtkSmartPointer<vtkArrowSource> arrowSource = vtkSmartPointer<vtkArrowSource>::New(); arrowSource->SetTipLength(0.3); arrowSource->SetTipRadius(0.1); arrowSource->SetShaftRadius(0.03); vtkSmartPointer<vtkGlyph3D> glyph3D = vtkSmartPointer<vtkGlyph3D>::New(); glyph3D->SetInputData(arrowSource->GetOutput()); vtkSmartPointer<vtkPolyData> polyData = vtkSmartPointer<vtkPolyData>::New(); vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New(); vtkSmartPointer<vtkIntArray> vectors = vtkSmartPointer<vtkIntArray>::New(); vectors->SetNumberOfComponents(3); // 添加矢量和点 for (int i = 0; i < 5; ++i) { for (int j = 0; j < 5; ++j) { double x = i * 0.2; double y = j * 0.2; double z = 0.0; points->InsertNextPoint(x, y, z); int v[3] = {i, j, 0}; vectors->InsertNextTupleValue(v); } } polyData->SetPoints(points); polyData->GetPointData()->SetVectors(vectors); glyph3D->SetSourceConnection(arrowSource->GetOutputPort()); glyph3D->SetInputData(polyData); glyph3D->Update(); vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New(); mapper->SetInputConnection(glyph3D->GetOutputPort()); vtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New(); actor->SetMapper(mapper); // 添加actor到renderer中 renderer->AddActor(actor); vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New(); interactor->SetRenderWindow(renderWindow); button->connect(button, &QPushButton::clicked, [&](){ renderer->ResetCamera(); renderWindow->Render(); }); interactor->Initialize(); app.exec(); return 0; } ``` 这个程序首先创建了一个QT窗口,并在窗口中添加了一个按钮。当点击按钮时,程序会显示矢量箭头。 程序使用vtkArrowSource创建了一个箭头,然后使用vtkGlyph3D将箭头放置在二维平面上的多个点上。这些点由vtkPoints对象存储,并使用vtkPolyData对象将它们组合在一起。这些点的矢量由vtkIntArray对象存储,并使用vtkPolyData的SetPointData()函数将它们附加到vtkPolyData对象上。 最后,程序使用vtkPolyDataMapper和vtkActor将箭头可视化,然后将actor添加到vtkRenderer中。当点击按钮时,程序会重置渲染器的相机并更新窗口。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值