qwt_vectorfield_symbol.cpp
Go to the documentation of this file.
1 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
2  * Qwt Widget Library
3  * Copyright (C) 1997 Josef Wilgen
4  * Copyright (C) 2002 Uwe Rathmann
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it under the terms of the Qwt License, Version 1.0
8  *****************************************************************************/
9 
10 #include "qwt_vectorfield_symbol.h"
11 
12 #include <qpainter.h>
13 #include <qpainterpath.h>
14 
16 {
17 }
18 
20 {
21 }
22 
24 {
25 public:
26  PrivateData( qreal headW, qreal tailW ):
27  headWidth( headW ),
28  tailWidth( tailW ),
29  length( headW + 4.0 )
30  {
31  /*
32  Arrow is drawn horizontally, pointing into positive x direction
33  with tip at 0,0.
34  */
35 
36  path.lineTo( -headWidth, headWidth );
37  path.lineTo( -headWidth, tailWidth );
38  path.lineTo( -length, tailWidth );
39  path.lineTo( -length, -tailWidth );
40  path.lineTo( -headWidth, -tailWidth );
41  path.lineTo( -headWidth, -headWidth );
42 
43  path.closeSubpath();
44  }
45 
46  void setLength( qreal l )
47  {
48  length = qMax( l, headWidth );
49 
50  path.setElementPositionAt( 3, -length, tailWidth );
51  path.setElementPositionAt( 4, -length, -tailWidth );
52  }
53 
54  const qreal headWidth;
55  const qreal tailWidth;
56  qreal length;
57 
58  QPainterPath path;
59 
60 };
61 
62 QwtVectorFieldArrow::QwtVectorFieldArrow( qreal headWidth, qreal tailWidth )
63 {
64  d_data = new PrivateData( headWidth, tailWidth );
65 }
66 
68 {
69  delete d_data;
70 }
71 
73 {
74  d_data->setLength( length );
75 }
76 
78 {
79  return d_data->length;
80 }
81 
82 void QwtVectorFieldArrow::paint( QPainter *painter ) const
83 {
84  painter->drawPath( d_data->path );
85 }
86 
88 {
89 public:
90  PrivateData( qreal headW ):
91  headWidth( headW ),
92  length( headW + 4.0 )
93  {
94  path.lineTo( -headWidth, headWidth * 0.6 );
95  path.moveTo( 0, 0 );
96  path.lineTo( -headWidth, -headWidth * 0.6 );
97  path.moveTo( 0, 0 );
98  path.lineTo( -length, 0 );
99  }
100 
101  const qreal headWidth;
102  qreal length;
103 
104  QPainterPath path;
105 };
106 
108 {
109  d_data = new PrivateData( headWidth );
110 }
111 
113 {
114  delete d_data;
115 }
116 
118 {
119  d_data->length = length;
120 
121  const qreal headWidth = qMin( d_data->headWidth, length / 3.0 );
122 
123  QPainterPath& path = d_data->path;
124 
125  path.setElementPositionAt( 1, -headWidth, headWidth * 0.6 );
126  path.setElementPositionAt( 3, -headWidth, -headWidth * 0.6 );
127  path.setElementPositionAt( 5, -length, 0 );
128 }
129 
131 {
132  return d_data->length;
133 }
134 
135 void QwtVectorFieldThinArrow::paint(QPainter * p) const
136 {
137  p->drawPath( d_data->path );
138 }
virtual ~QwtVectorFieldArrow() QWT_OVERRIDE
virtual qreal length() const QWT_OVERRIDE
virtual qreal length() const =0
virtual void paint(QPainter *) const QWT_OVERRIDE
QwtVectorFieldArrow(qreal headWidth=6.0, qreal tailWidth=1.0)
virtual void setLength(qreal length) QWT_OVERRIDE
virtual qreal length() const QWT_OVERRIDE
virtual ~QwtVectorFieldThinArrow() QWT_OVERRIDE
QwtVectorFieldThinArrow(qreal headWidth=6.0)
virtual void setLength(qreal length) QWT_OVERRIDE
virtual void paint(QPainter *) const QWT_OVERRIDE


plotjuggler
Author(s): Davide Faconti
autogenerated on Sun Dec 6 2020 03:48:10