区块链技术博客
www.b2bchain.cn

Qt翻页效果实现(二):坐标计算求职学习资料

本文介绍了Qt翻页效果实现(二):坐标计算求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

  • 前言
  • 计算简化说明
  • 计算流程说明
    • 数据定义
    • 功能函数
    • 计算代码

前言

上文说到,需要实现翻页效果,就需知计算各个点的坐标,以确定点C在不同位置时,各个区域的大小;这样能准确的做图像填充,展现的效果也就准备逼真。
如下图,这张图其实只是我随手画的,然后将各个区域填充成不同的颜色,看上去的效果也相当真实了。
Qt翻页效果实现(二):坐标计算

计算简化说明

对于双开的书本,对其任何位置进行翻页都是可以的,为了简化问题,我默认翻页是从四个角落开始的。

就算从中间翻开,与原平面平行,即C点在下边AD上,也可以看成是通过翻动C点,角度为0或者180度,在打开书本。

当不与原平面平行,即有夹角的时候,有一种情况就是如上图这样,C点在线AD上面;另一种就是点C在线AD下面,大家其实可以简单想想一下,就是将上图垂直翻转一下就行。如果是手机,更可以直接倒过来看一下。这样的情况更可以看成是点C在翻动。

我们可以先以最直观的右下角进行计算各个坐标的位置,其他角落的坐标可以根据右下角的方式对照着进行计算。

比如右上角因为与右下角是垂直翻转的,上面的图现在就可以看成是E点在翻动;反过来说,当C点在AD线下面时,就是右上角E点类似的现在C点翻动的情况。具体到计算的时候,就会发现代码的相近之处。

因此左下角可以看成是右下角的水平翻转;左上角既可以看成是右上角的水平翻转,也可以看成是左下角的垂直翻转。

计算流程说明

数据定义

首先定义一个单独计算坐标的类PageFlipMath;
因为有4个角落,所以定义了一个枚举,4枚举值,与角落对应,即,及对应变量如下如下:

    enum StartCorner {TopLeft, BottomLeft, TopRight, BottomRight}; private:     StartCorner m_startCorner;

因为有三角函数的引入,为了更准确地计算点坐标,通过QPointF表示坐标点。再有就是由于在点C在不同区域时,区域的形状是不一样的,组成区域的坐标点也不同;所以将区域点通过链表形式表示;定义如下:

QList<QPointF> m_ports1; QList<QPointF> m_ports2; QList<QPointF> m_ports3;

为了适应不同界面大小的坐标计算,添加设置窗体大小接口,及对应变量如下:

public:     QRect pageRect() const { return m_pageRect; }     void setPageRect(const QRect& rect) { m_pageRect = rect; }  private:     QRect m_pageRect;

其中还有一些扩展的数据,用于保存一些其他点的左边,有几个后期需要用到的,在此就先留一个悬念。定义如下:

   QPointF m_pos;  // 可以看成是C点,即传进来的鼠标点,会变更的     qreal m_angle;    // 角度     // 下面的就是:后期需要用到的,后面补坑     QPointF m_middle;       QPointF m_begin;     QPointF m_end;

功能函数

上文说到的计算两个点之间距离的函数也必不可少,定义及实现如下:

// PageFlipMath.h private:     qreal distance(const QPointF &a, const QPointF &b);  // PageFlipMath.cpp qreal PageFlipMath::distance(const QPointF &a, const QPointF &b) {     QPointF x = a - b;     return sqrt(x.x()*x.x() + x.y()*x.y()); }

上文提到的另一个问题,就是点C所在范围受到限制的问题,通过昨天的图也可以看出,就是受到书本底边PD的长度影响。
Qt翻页效果实现(二):坐标计算
假设当点C(鼠标位置)超出黑色圆外时,假设这时线段PC与圆弧的焦点为点C’,我们可以将这时的 点C’ 当做真正的点 C,即点C的当前极限位置。
此功能的函数实现如下:

// PageFlipMath.h private:     void getClosestPointOnCircle(QPointF &cur, const QPointF &old, qreal d=0);  // PageFlipMath.cpp void PageFlipMath::getClosestPointOnCircle(QPointF &cur, const QPointF &old, qreal d) {     if (d == 0) d = m_pageRect.width();   // d 是底边长度,或者说是圆的半径      double vX = cur.x() - old.x();     double vY = cur.y() - old.y();     double magV = sqrt(vX * vX + vY * vY);     double aX = old.x() + vX / magV * d;     double aY = old.y() + vY / magV * d;      m_pos = cur = QPointF(aX, aY);  // m_pos  是保存的当前点C的坐标 }

计算代码

左边点的计算上文和本文也讲了很多了,如果精细到将每个点的计算过程都讲一遍,就有点画蛇添足了,具体细节就在此略过,直接贴上代码了。

有兴趣的小伙伴可以优化或者自己计算实现一遍,可能比我写的好哦;因为我发现在我写这篇文章,梳理以前的思路的时候,就发现以前写的有点复杂了。

注意:里面有些点和我画的图的点表示并不一一对应,所以请有兴趣的小伙伴不要看的时候看迷糊了。毕竟代码完成于几年前了,还请见谅。

计算函数定义如下:
“`
// PageFlipMath.h
public:
void compute(const QPointF &pos);

// PageFlipMath.cpp
void PageFlipMath::compute(const QPointF &pos)
{
m_pos = QPointF(pos.x(), pos.y());
int w = m_pageRect.width();
int h = m_pageRect.height();
m_ports1.clear();
m_ports2.clear();
m_ports3.clear();
m_angle = 0;
QPointF o = pos;
if (m_startCorner == BottomLeft) {
QPointF s(w, h), p(0, h), a, c, d;
if (distance(o, s) > w) getClosestPointOnCircle(o, s);
qreal djx = distance(QPoint(w,0), p);
if (distance(o, QPoint(w,0)) > djx)
getClosestPointOnCircle(o, QPoint(w,0), djx);

    m_begin = p;     m_end = o;      if (o == p) {         m_ports1.append(QPointF(0, h));         m_ports1.append(QPointF(w, h));         m_ports1.append(QPointF(w, 0));         m_ports1.append(QPointF(0, 0));         return;     }      qreal dop = distance(o,p);     qreal by = h+10;      a.setY(h);     if (o.y() == h) {         qreal doa = dop/2;         a.setX(doa);         c.setX(doa);         c.setY(0);         d.setX(o.x());         d.setY(0);     }     else if (o.y() < h) {         qreal angle = asin((h-o.y())/dop);         qreal angle2 = 2*angle;         m_angle = angle2;         qreal sinAngle2 = sin(angle2);         qreal doa = (h-o.y())/sinAngle2;         a.setX(doa);         qreal tanVal = tan(PI/2-angle);         by = tanVal*doa;          if (by <= h) {             c.setX(0);             c.setY(h-by);         }         else {             qreal cw = (by-h)/tanVal;             c.setX(cw);             c.setY(0);              qreal ddx = cos(angle2)*cw;             qreal ddy = sinAngle2*cw;             d.setX(c.x()+ddx);             d.setY(-ddy);         }     }     else {         qreal angle = asin((o.y()-h)/dop);         qreal angle2 = 2*angle;         m_angle = -angle2;         qreal sinAngle2 = sin(angle2);         qreal doa = (o.y()-h)/sinAngle2;         a.setX(doa);         qreal cx = a.x()+h/tan(PI/2- angle);         c.setX(cx);         c.setY(0);         qreal cw = c.x();         qreal ddy = sinAngle2*cw;         qreal ddx = cos(angle2)*cw;         d.setX(c.x()+ddx);         d.setY(ddy);         m_end = d;         m_begin = QPointF(0, 0);     }      if (by <= h) {         m_ports1.append(a);         m_ports1.append(s);         m_ports1.append(QPointF(w, 0));         m_ports1.append(QPointF(0, 0));         m_ports1.append(c);          m_ports2.append(a);         m_ports2.append(o);         m_ports2.append(c);          m_ports3.append(a);         m_ports3.append(c);         m_ports3.append(p);     }     else {         m_ports1.append(a);         m_ports1.append(s);         m_ports1.append(QPointF(w, 0));         m_ports1.append(c);          m_ports2.append(a);         m_ports2.append(o);         m_ports2.append(d);         m_ports2.append(c);          m_ports3.append(p);         m_ports3.append(a);         m_ports3.append(c);         m_ports3.append(QPointF(0, 0));     } } else if (m_startCorner == BottomRight) {     QPointF s(0, h), p(w, h), a, c, d;     if (distance(o, s) > w) getClosestPointOnCircle(o, s);     qreal djx = distance(QPoint(0,0), p);     if (distance(o, QPoint(0,0)) > djx)         getClosestPointOnCircle(o, QPoint(0,0), djx);     m_begin = p;     m_end = o;      if (o == p) {         m_ports1.append(QPointF(0, h));         m_ports1.append(QPointF(w, h));         m_ports1.append(QPointF(w, 0));         m_ports1.append(QPointF(0, 0));         return;     }      qreal dop = distance(o,p);     qreal by = h+10;      a.setY(h);     if (o.y() == h) {         qreal doa = dop/2;         a.setX(w-doa);         c.setX(w-doa);         c.setY(0);         d.setX(o.x());         d.setY(0);     }     else if (o.y() < h) {         qreal angle = asin((h-o.y())/dop);         qreal angle2 = 2*angle;         m_angle = angle2;         qreal sinAngle2 = sin(angle2);         qreal doa = (h-o.y())/sinAngle2;         a.setX(w-doa);         qreal tanVal = tan(PI/2-angle);         by = tanVal*doa;          if (by <= h) {             c.setX(w);             c.setY(h-by);         }         else {             qreal cw = (by-h)/tanVal;             c.setX(w-cw);             c.setY(0);              qreal ddx = cos(angle2)*cw;             qreal ddy = sinAngle2*cw;             d.setX(c.x()-ddx);             d.setY(-ddy);

  • 前言
  • 计算简化说明
  • 计算流程说明
    • 数据定义
    • 功能函数
    • 计算代码

前言

上文说到,需要实现翻页效果,就需知计算各个点的坐标,以确定点C在不同位置时,各个区域的大小;这样能准确的做图像填充,展现的效果也就准备逼真。
如下图,这张图其实只是我随手画的,然后将各个区域填充成不同的颜色,看上去的效果也相当真实了。
Qt翻页效果实现(二):坐标计算

计算简化说明

对于双开的书本,对其任何位置进行翻页都是可以的,为了简化问题,我默认翻页是从四个角落开始的。

就算从中间翻开,与原平面平行,即C点在下边AD上,也可以看成是通过翻动C点,角度为0或者180度,在打开书本。

当不与原平面平行,即有夹角的时候,有一种情况就是如上图这样,C点在线AD上面;另一种就是点C在线AD下面,大家其实可以简单想想一下,就是将上图垂直翻转一下就行。如果是手机,更可以直接倒过来看一下。这样的情况更可以看成是点C在翻动。

我们可以先以最直观的右下角进行计算各个坐标的位置,其他角落的坐标可以根据右下角的方式对照着进行计算。

比如右上角因为与右下角是垂直翻转的,上面的图现在就可以看成是E点在翻动;反过来说,当C点在AD线下面时,就是右上角E点类似的现在C点翻动的情况。具体到计算的时候,就会发现代码的相近之处。

因此左下角可以看成是右下角的水平翻转;左上角既可以看成是右上角的水平翻转,也可以看成是左下角的垂直翻转。

计算流程说明

数据定义

首先定义一个单独计算坐标的类PageFlipMath;
因为有4个角落,所以定义了一个枚举,4枚举值,与角落对应,即,及对应变量如下如下:

    enum StartCorner {TopLeft, BottomLeft, TopRight, BottomRight}; private:     StartCorner m_startCorner;

因为有三角函数的引入,为了更准确地计算点坐标,通过QPointF表示坐标点。再有就是由于在点C在不同区域时,区域的形状是不一样的,组成区域的坐标点也不同;所以将区域点通过链表形式表示;定义如下:

QList<QPointF> m_ports1; QList<QPointF> m_ports2; QList<QPointF> m_ports3;

为了适应不同界面大小的坐标计算,添加设置窗体大小接口,及对应变量如下:

public:     QRect pageRect() const { return m_pageRect; }     void setPageRect(const QRect& rect) { m_pageRect = rect; }  private:     QRect m_pageRect;

其中还有一些扩展的数据,用于保存一些其他点的左边,有几个后期需要用到的,在此就先留一个悬念。定义如下:

   QPointF m_pos;  // 可以看成是C点,即传进来的鼠标点,会变更的     qreal m_angle;    // 角度     // 下面的就是:后期需要用到的,后面补坑     QPointF m_middle;       QPointF m_begin;     QPointF m_end;

功能函数

上文说到的计算两个点之间距离的函数也必不可少,定义及实现如下:

// PageFlipMath.h private:     qreal distance(const QPointF &a, const QPointF &b);  // PageFlipMath.cpp qreal PageFlipMath::distance(const QPointF &a, const QPointF &b) {     QPointF x = a - b;     return sqrt(x.x()*x.x() + x.y()*x.y()); }

上文提到的另一个问题,就是点C所在范围受到限制的问题,通过昨天的图也可以看出,就是受到书本底边PD的长度影响。
Qt翻页效果实现(二):坐标计算
假设当点C(鼠标位置)超出黑色圆外时,假设这时线段PC与圆弧的焦点为点C’,我们可以将这时的 点C’ 当做真正的点 C,即点C的当前极限位置。
此功能的函数实现如下:

// PageFlipMath.h private:     void getClosestPointOnCircle(QPointF &cur, const QPointF &old, qreal d=0);  // PageFlipMath.cpp void PageFlipMath::getClosestPointOnCircle(QPointF &cur, const QPointF &old, qreal d) {     if (d == 0) d = m_pageRect.width();   // d 是底边长度,或者说是圆的半径      double vX = cur.x() - old.x();     double vY = cur.y() - old.y();     double magV = sqrt(vX * vX + vY * vY);     double aX = old.x() + vX / magV * d;     double aY = old.y() + vY / magV * d;      m_pos = cur = QPointF(aX, aY);  // m_pos  是保存的当前点C的坐标 }

计算代码

左边点的计算上文和本文也讲了很多了,如果精细到将每个点的计算过程都讲一遍,就有点画蛇添足了,具体细节就在此略过,直接贴上代码了。

有兴趣的小伙伴可以优化或者自己计算实现一遍,可能比我写的好哦;因为我发现在我写这篇文章,梳理以前的思路的时候,就发现以前写的有点复杂了。

注意:里面有些点和我画的图的点表示并不一一对应,所以请有兴趣的小伙伴不要看的时候看迷糊了。毕竟代码完成于几年前了,还请见谅。

计算函数定义如下:
“`
// PageFlipMath.h
public:
void compute(const QPointF &pos);

// PageFlipMath.cpp
void PageFlipMath::compute(const QPointF &pos)
{
m_pos = QPointF(pos.x(), pos.y());
int w = m_pageRect.width();
int h = m_pageRect.height();
m_ports1.clear();
m_ports2.clear();
m_ports3.clear();
m_angle = 0;
QPointF o = pos;
if (m_startCorner == BottomLeft) {
QPointF s(w, h), p(0, h), a, c, d;
if (distance(o, s) > w) getClosestPointOnCircle(o, s);
qreal djx = distance(QPoint(w,0), p);
if (distance(o, QPoint(w,0)) > djx)
getClosestPointOnCircle(o, QPoint(w,0), djx);

    m_begin = p;     m_end = o;      if (o == p) {         m_ports1.append(QPointF(0, h));         m_ports1.append(QPointF(w, h));         m_ports1.append(QPointF(w, 0));         m_ports1.append(QPointF(0, 0));         return;     }      qreal dop = distance(o,p);     qreal by = h+10;      a.setY(h);     if (o.y() == h) {         qreal doa = dop/2;         a.setX(doa);         c.setX(doa);         c.setY(0);         d.setX(o.x());         d.setY(0);     }     else if (o.y() < h) {         qreal angle = asin((h-o.y())/dop);         qreal angle2 = 2*angle;         m_angle = angle2;         qreal sinAngle2 = sin(angle2);         qreal doa = (h-o.y())/sinAngle2;         a.setX(doa);         qreal tanVal = tan(PI/2-angle);         by = tanVal*doa;          if (by <= h) {             c.setX(0);             c.setY(h-by);         }         else {             qreal cw = (by-h)/tanVal;             c.setX(cw);             c.setY(0);              qreal ddx = cos(angle2)*cw;             qreal ddy = sinAngle2*cw;             d.setX(c.x()+ddx);             d.setY(-ddy);         }     }     else {         qreal angle = asin((o.y()-h)/dop);         qreal angle2 = 2*angle;         m_angle = -angle2;         qreal sinAngle2 = sin(angle2);         qreal doa = (o.y()-h)/sinAngle2;         a.setX(doa);         qreal cx = a.x()+h/tan(PI/2- angle);         c.setX(cx);         c.setY(0);         qreal cw = c.x();         qreal ddy = sinAngle2*cw;         qreal ddx = cos(angle2)*cw;         d.setX(c.x()+ddx);         d.setY(ddy);         m_end = d;         m_begin = QPointF(0, 0);     }      if (by <= h) {         m_ports1.append(a);         m_ports1.append(s);         m_ports1.append(QPointF(w, 0));         m_ports1.append(QPointF(0, 0));         m_ports1.append(c);          m_ports2.append(a);         m_ports2.append(o);         m_ports2.append(c);          m_ports3.append(a);         m_ports3.append(c);         m_ports3.append(p);     }     else {         m_ports1.append(a);         m_ports1.append(s);         m_ports1.append(QPointF(w, 0));         m_ports1.append(c);          m_ports2.append(a);         m_ports2.append(o);         m_ports2.append(d);         m_ports2.append(c);          m_ports3.append(p);         m_ports3.append(a);         m_ports3.append(c);         m_ports3.append(QPointF(0, 0));     } } else if (m_startCorner == BottomRight) {     QPointF s(0, h), p(w, h), a, c, d;     if (distance(o, s) > w) getClosestPointOnCircle(o, s);     qreal djx = distance(QPoint(0,0), p);     if (distance(o, QPoint(0,0)) > djx)         getClosestPointOnCircle(o, QPoint(0,0), djx);     m_begin = p;     m_end = o;      if (o == p) {         m_ports1.append(QPointF(0, h));         m_ports1.append(QPointF(w, h));         m_ports1.append(QPointF(w, 0));         m_ports1.append(QPointF(0, 0));         return;     }      qreal dop = distance(o,p);     qreal by = h+10;      a.setY(h);     if (o.y() == h) {         qreal doa = dop/2;         a.setX(w-doa);         c.setX(w-doa);         c.setY(0);         d.setX(o.x());         d.setY(0);     }     else if (o.y() < h) {         qreal angle = asin((h-o.y())/dop);         qreal angle2 = 2*angle;         m_angle = angle2;         qreal sinAngle2 = sin(angle2);         qreal doa = (h-o.y())/sinAngle2;         a.setX(w-doa);         qreal tanVal = tan(PI/2-angle);         by = tanVal*doa;          if (by <= h) {             c.setX(w);             c.setY(h-by);         }         else {             qreal cw = (by-h)/tanVal;             c.setX(w-cw);             c.setY(0);              qreal ddx = cos(angle2)*cw;             qreal ddy = sinAngle2*cw;             d.setX(c.x()-ddx);             d.setY(-ddy);

  • 前言
  • 计算简化说明
  • 计算流程说明
    • 数据定义
    • 功能函数
    • 计算代码

前言

上文说到,需要实现翻页效果,就需知计算各个点的坐标,以确定点C在不同位置时,各个区域的大小;这样能准确的做图像填充,展现的效果也就准备逼真。
如下图,这张图其实只是我随手画的,然后将各个区域填充成不同的颜色,看上去的效果也相当真实了。
Qt翻页效果实现(二):坐标计算

计算简化说明

对于双开的书本,对其任何位置进行翻页都是可以的,为了简化问题,我默认翻页是从四个角落开始的。

就算从中间翻开,与原平面平行,即C点在下边AD上,也可以看成是通过翻动C点,角度为0或者180度,在打开书本。

当不与原平面平行,即有夹角的时候,有一种情况就是如上图这样,C点在线AD上面;另一种就是点C在线AD下面,大家其实可以简单想想一下,就是将上图垂直翻转一下就行。如果是手机,更可以直接倒过来看一下。这样的情况更可以看成是点C在翻动。

我们可以先以最直观的右下角进行计算各个坐标的位置,其他角落的坐标可以根据右下角的方式对照着进行计算。

比如右上角因为与右下角是垂直翻转的,上面的图现在就可以看成是E点在翻动;反过来说,当C点在AD线下面时,就是右上角E点类似的现在C点翻动的情况。具体到计算的时候,就会发现代码的相近之处。

因此左下角可以看成是右下角的水平翻转;左上角既可以看成是右上角的水平翻转,也可以看成是左下角的垂直翻转。

计算流程说明

数据定义

首先定义一个单独计算坐标的类PageFlipMath;
因为有4个角落,所以定义了一个枚举,4枚举值,与角落对应,即,及对应变量如下如下:

    enum StartCorner {TopLeft, BottomLeft, TopRight, BottomRight}; private:     StartCorner m_startCorner;

因为有三角函数的引入,为了更准确地计算点坐标,通过QPointF表示坐标点。再有就是由于在点C在不同区域时,区域的形状是不一样的,组成区域的坐标点也不同;所以将区域点通过链表形式表示;定义如下:

QList<QPointF> m_ports1; QList<QPointF> m_ports2; QList<QPointF> m_ports3;

为了适应不同界面大小的坐标计算,添加设置窗体大小接口,及对应变量如下:

public:     QRect pageRect() const { return m_pageRect; }     void setPageRect(const QRect& rect) { m_pageRect = rect; }  private:     QRect m_pageRect;

其中还有一些扩展的数据,用于保存一些其他点的左边,有几个后期需要用到的,在此就先留一个悬念。定义如下:

   QPointF m_pos;  // 可以看成是C点,即传进来的鼠标点,会变更的     qreal m_angle;    // 角度     // 下面的就是:后期需要用到的,后面补坑     QPointF m_middle;       QPointF m_begin;     QPointF m_end;

功能函数

上文说到的计算两个点之间距离的函数也必不可少,定义及实现如下:

// PageFlipMath.h private:     qreal distance(const QPointF &a, const QPointF &b);  // PageFlipMath.cpp qreal PageFlipMath::distance(const QPointF &a, const QPointF &b) {     QPointF x = a - b;     return sqrt(x.x()*x.x() + x.y()*x.y()); }

上文提到的另一个问题,就是点C所在范围受到限制的问题,通过昨天的图也可以看出,就是受到书本底边PD的长度影响。
Qt翻页效果实现(二):坐标计算
假设当点C(鼠标位置)超出黑色圆外时,假设这时线段PC与圆弧的焦点为点C’,我们可以将这时的 点C’ 当做真正的点 C,即点C的当前极限位置。
此功能的函数实现如下:

// PageFlipMath.h private:     void getClosestPointOnCircle(QPointF &cur, const QPointF &old, qreal d=0);  // PageFlipMath.cpp void PageFlipMath::getClosestPointOnCircle(QPointF &cur, const QPointF &old, qreal d) {     if (d == 0) d = m_pageRect.width();   // d 是底边长度,或者说是圆的半径      double vX = cur.x() - old.x();     double vY = cur.y() - old.y();     double magV = sqrt(vX * vX + vY * vY);     double aX = old.x() + vX / magV * d;     double aY = old.y() + vY / magV * d;      m_pos = cur = QPointF(aX, aY);  // m_pos  是保存的当前点C的坐标 }

计算代码

左边点的计算上文和本文也讲了很多了,如果精细到将每个点的计算过程都讲一遍,就有点画蛇添足了,具体细节就在此略过,直接贴上代码了。

有兴趣的小伙伴可以优化或者自己计算实现一遍,可能比我写的好哦;因为我发现在我写这篇文章,梳理以前的思路的时候,就发现以前写的有点复杂了。

注意:里面有些点和我画的图的点表示并不一一对应,所以请有兴趣的小伙伴不要看的时候看迷糊了。毕竟代码完成于几年前了,还请见谅。

计算函数定义如下:
“`
// PageFlipMath.h
public:
void compute(const QPointF &pos);

// PageFlipMath.cpp
void PageFlipMath::compute(const QPointF &pos)
{
m_pos = QPointF(pos.x(), pos.y());
int w = m_pageRect.width();
int h = m_pageRect.height();
m_ports1.clear();
m_ports2.clear();
m_ports3.clear();
m_angle = 0;
QPointF o = pos;
if (m_startCorner == BottomLeft) {
QPointF s(w, h), p(0, h), a, c, d;
if (distance(o, s) > w) getClosestPointOnCircle(o, s);
qreal djx = distance(QPoint(w,0), p);
if (distance(o, QPoint(w,0)) > djx)
getClosestPointOnCircle(o, QPoint(w,0), djx);

    m_begin = p;     m_end = o;      if (o == p) {         m_ports1.append(QPointF(0, h));         m_ports1.append(QPointF(w, h));         m_ports1.append(QPointF(w, 0));         m_ports1.append(QPointF(0, 0));         return;     }      qreal dop = distance(o,p);     qreal by = h+10;      a.setY(h);     if (o.y() == h) {         qreal doa = dop/2;         a.setX(doa);         c.setX(doa);         c.setY(0);         d.setX(o.x());         d.setY(0);     }     else if (o.y() < h) {         qreal angle = asin((h-o.y())/dop);         qreal angle2 = 2*angle;         m_angle = angle2;         qreal sinAngle2 = sin(angle2);         qreal doa = (h-o.y())/sinAngle2;         a.setX(doa);         qreal tanVal = tan(PI/2-angle);         by = tanVal*doa;          if (by <= h) {             c.setX(0);             c.setY(h-by);         }         else {             qreal cw = (by-h)/tanVal;             c.setX(cw);             c.setY(0);              qreal ddx = cos(angle2)*cw;             qreal ddy = sinAngle2*cw;             d.setX(c.x()+ddx);             d.setY(-ddy);         }     }     else {         qreal angle = asin((o.y()-h)/dop);         qreal angle2 = 2*angle;         m_angle = -angle2;         qreal sinAngle2 = sin(angle2);         qreal doa = (o.y()-h)/sinAngle2;         a.setX(doa);         qreal cx = a.x()+h/tan(PI/2- angle);         c.setX(cx);         c.setY(0);         qreal cw = c.x();         qreal ddy = sinAngle2*cw;         qreal ddx = cos(angle2)*cw;         d.setX(c.x()+ddx);         d.setY(ddy);         m_end = d;         m_begin = QPointF(0, 0);     }      if (by <= h) {         m_ports1.append(a);         m_ports1.append(s);         m_ports1.append(QPointF(w, 0));         m_ports1.append(QPointF(0, 0));         m_ports1.append(c);          m_ports2.append(a);         m_ports2.append(o);         m_ports2.append(c);          m_ports3.append(a);         m_ports3.append(c);         m_ports3.append(p);     }     else {         m_ports1.append(a);         m_ports1.append(s);         m_ports1.append(QPointF(w, 0));         m_ports1.append(c);          m_ports2.append(a);         m_ports2.append(o);         m_ports2.append(d);         m_ports2.append(c);          m_ports3.append(p);         m_ports3.append(a);         m_ports3.append(c);         m_ports3.append(QPointF(0, 0));     } } else if (m_startCorner == BottomRight) {     QPointF s(0, h), p(w, h), a, c, d;     if (distance(o, s) > w) getClosestPointOnCircle(o, s);     qreal djx = distance(QPoint(0,0), p);     if (distance(o, QPoint(0,0)) > djx)         getClosestPointOnCircle(o, QPoint(0,0), djx);     m_begin = p;     m_end = o;      if (o == p) {         m_ports1.append(QPointF(0, h));         m_ports1.append(QPointF(w, h));         m_ports1.append(QPointF(w, 0));         m_ports1.append(QPointF(0, 0));         return;     }      qreal dop = distance(o,p);     qreal by = h+10;      a.setY(h);     if (o.y() == h) {         qreal doa = dop/2;         a.setX(w-doa);         c.setX(w-doa);         c.setY(0);         d.setX(o.x());         d.setY(0);     }     else if (o.y() < h) {         qreal angle = asin((h-o.y())/dop);         qreal angle2 = 2*angle;         m_angle = angle2;         qreal sinAngle2 = sin(angle2);         qreal doa = (h-o.y())/sinAngle2;         a.setX(w-doa);         qreal tanVal = tan(PI/2-angle);         by = tanVal*doa;          if (by <= h) {             c.setX(w);             c.setY(h-by);         }         else {             qreal cw = (by-h)/tanVal;             c.setX(w-cw);             c.setY(0);              qreal ddx = cos(angle2)*cw;             qreal ddy = sinAngle2*cw;             d.setX(c.x()-ddx);             d.setY(-ddy);

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » Qt翻页效果实现(二):坐标计算求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们