齿轮渐开线方程及绘制

齿轮轮齿轮廓是一个渐开线方程,当一根绳子绕紧一个圆拉直了端部旋转,则绳子端部画出的曲线就是一个螺旋状的渐开线,方程如下,渐开线齿之间啮合传动能保持恒定传动比,传动平稳等特性。

QPointF involute(float r, float s)
{
	float x=r*cos(s) + r*s*sin(s);
	float y=r*sin(s) - r*s*cos(s);
	return QPointF(x,y);
}

下面还是用QPainter将曲线离散为多段线进行可视化。demo是用c4droid编译的apk放到蓝奏上面
我用蓝奏浏览器分享了[curvetest01], 下载链接:https://wwp.lanzoup.com/iTE2A12mp58j 提取码 : 8mok, 你可以不限速下载哦

#include <QApplication>
#include <QLabel>
#include <QWidget>
#include <QPainter>
#include <QTimer>
#include <QMouseEvent>

#include<vector>

#define _USE_MATH_DEFINES
#include <math.h>

float deg2rad(float si)
{
	return (si*M_PI)/180.0;
}

QPointF involute(float r, float s)
{
	float x=r*cos(s) + r*s*sin(s);
	float y=r*sin(s) - r*s*cos(s);
	return QPointF(x,y);
}

void createInvoNodes(float cx,float cy,float r, int n, float ds, std::vector<QPointF>& polyline)
{
	for(int i=0;i<n;i++)
	{
		float s=float(i)*ds;
		QPointF v=involute(r,s);
		QPointF revv=QPointF(cx+v.x(),cy-v.y());
		polyline.push_back(revv);
	}
}

class GrphWidget : public QWidget
{
    //Q_OBJECT
 
public:
    std::vector<QPointF> _invoNodes;

    GrphWidget(QWidget *parent = 0):
    QWidget(parent)
    {
    }
    ~GrphWidget()
    {}
    
    void mousePressEvent(QMouseEvent *event)
{
}
 
    void paintEvent(QPaintEvent* event)
    {
    	int w =this->width();
    	int h = this->height();
    	
    	float cx=w*0.5;
	    float cy=h*0.5;
	    float r=200.0;
    	
    	if (_invoNodes.empty())
    	{
    	 	createInvoNodes(cx, cy,r,100,deg2rad(2.0), _invoNodes);
    	}
    	
        QPainter p(this);
        p.setRenderHint(QPainter::Antialiasing);
        
    	 
	    // draw axis
	    p.setPen(QPen(Qt::black, 2));
        p.drawLine( 0,h/2,w, h/2   );
        p.drawLine( w/2,0,w/2, h  );
	 
	    // draw circle
	     p.setPen(QPen(Qt::red, 4));
	    p.drawEllipse(cx-r,cy-r,2*r,2*r);
	    
	    // draw involute 
	    p.setPen(QPen(Qt::blue, 4));
	    p.drawPolyline(_invoNodes.data(), _invoNodes.size());
	    
	    
	    //p.drawText(30,50,std::to_string(_invoNodes.size()).data());
    	
        p.end();
        
    }

};
 
int main(int argc, char* argv[])
 {
    QApplication app(argc, argv);    
   
    GrphWidget* wgt=new GrphWidget;
    wgt->show();
    
    return app.exec();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值