我想画两点之间的弧线。我知道两点的位置和弧度的角度。 我成功地编写了一个小程序来计算圆的中心,然后才能有效地绘制圆弧。但是当我绘制一个圆来验证时,当我使用小值来表示弧度时,圆线不会越过给定的两个点。
#include <QApplication>
#include <QGraphicsEllipseItem>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QDebug>
#include <cmath>
#include <QPainter>
void cross(QPainterPath* path, double x, double y);
int main( int argc, char **argv )
{
QApplication app(argc, argv);
QGraphicsScene scene;
scene.setSceneRect( 0.0, 0.0, 500.0, 500.0 );
QPainterPath* path = new QPainterPath();
double x1, x2, y1, y2, l, rad, r;
double x3, y3, xx, yy;
const double PI = 3.14159265358979323846;
//first point
x1=250;
y1=250;
//second point
x2=350;
y2=300;
//radians - play with it. This is low value - this is buggy
rad=0.002;
l=sqrt (pow((x1-x2),2) + pow((y1-y2),2)); //distance between (x1,y) and (x2,y2)
u=180.0 * rad / PI; //transform radians in angle
r=(l/2.0)/sin(rad/2.0); //this is radius
//point in the middle of (x1,y) and (x2,y2)... half of l
x3 = (x1+x2)/2;
y3 = (y1+y2)/2;
//find center of circle
if(rad>0){
xx = x3 + sqrt(pow(r,2)-pow((l/2),2))*(y1-y2)/l;
yy = y3 + sqrt(pow(r,2)-pow((l/2),2))*(x2-x1)/l;
}else{
xx = x3 - sqrt(pow(r,2)-pow((l/2),2))*(y1-y2)/l;
yy = y3 - sqrt(pow(r,2)-pow((l/2),2))*(x2-x1)/l;
}
//draw circle to verify
path->moveTo(xx, yy);
path->addEllipse(QRectF(xx-r,yy-r,r*2,r*2));
cross(path, x3,y3);
cross(path, xx,yy);
cross(path, x1,y1);
cross(path, x2,y2);
qDebug() << "r =" << r << " xx =" << xx << " yy =" << yy ;
qDebug() << "Verify r - distance from (x1,y1) to center of circle" << sqrt (pow((x1-xx),2) + pow((y1-yy),2));
qDebug() << "Verify r - distance from (x2,y2) to center of circle" << sqrt (pow((x2-xx),2) + pow((y2-yy),2));
scene.addPath(*path);
QGraphicsView view( &scene );
view.show();
return app.exec();
}
void cross(QPainterPath* path, double x, double y){
path->moveTo(x, y-5);
path->lineTo(x, y+5);
path->moveTo(x-5, y);
path->lineTo(x+5, y);
}
但是,从两个点到圆心的距离等于计算的半径。 我哪里错了?
答案 0 :(得分:0)
我知道这则帖子很旧,但是由于该帖子被浏览了1000次且没有得到答复,所以我认为自己应该考虑一下。
我相信QT中的绘制椭圆函数使用4个贝塞尔曲线来创建形状。没有使用贝塞尔曲线表示圆的完美方法,相反,您需要瞄准可获得的最接近的近似值。
出于我的目的,我发现这篇bezier curve circle approximation堆栈溢出帖子非常有用。我确定的解决方案是,从该点本身开始,以大量的圆弧近似圆,以确保我的圆看起来可以穿过圆。
另一个选择是使用QT painter的“ drawPoint”函数编写自己的bresenham's circle drawing函数,以放置各个像素。我发现该解决方案在提高QT应用程序中的缩放级别时速度太慢,但是它的准确性令人难以置信。
希望这对下一次出现的人有帮助。