21#ifndef JKQTPDRAWINGTOOLS_H_INCLUDED
22#define JKQTPDRAWINGTOOLS_H_INCLUDED
23#include "jkqtcommon/jkqtcommon_imexport.h"
24#include <QPaintDevice>
33#include <QPainterPath>
37#include <forward_list>
42#include <QGuiApplication>
45#include "jkqtcommon/jkqtpmathtools.h"
46#include "jkqtcommon/jkqtpconcurrencytools.h"
47#include "jkqtcommon/jkqtpcodestructuring.h"
264 return static_cast<JKQTPGraphSymbols>(
static_cast<uint64_t
>(a)+
static_cast<uint64_t
>(b.unicode()));
303 str<<static_cast<quint64>(s);
309 str<<reinterpret_cast<quint64&>(s);
328template <
class TPa
inter>
329inline void JKQTPPlotSymbol(TPainter& painter,
double x,
double y,
JKQTPGraphSymbols symbol,
double size,
double symbolLineWidth, QColor color, QColor fillColor, QFont symbolFont);
425template <
class TPa
inter>
443template <
class TPa
inter>
496inline bool JKQTPClipLine(
double& x1 ,
double& y1 ,
double& x2 ,
double& y2 ,
double xmin ,
double xmax ,
double ymin,
double ymax) {
497 if (! ( x1<xmin && x2<xmin ) && !( x1>xmax && x2>xmax )) {
498 if ( !( y1<ymin && y2<ymin ) && !( y1>ymax && y2>ymax ) ) {
499 double x[2]= {x1,x2};
500 double y[2]= {y1,y2};
501 for (
int i=0; i<2; i++) {
504 y[i] = ( ( y2-y1 ) / ( x2-x1 ) ) * ( xmin-x1)+y1;
505 }
else if (x[i] > xmax) {
507 y[i] = ( ( y2-y1 ) / ( x2-x1 ) ) * ( xmax-x1)+y1;
511 x[i] = ( ( x2-x1 ) / ( y2-y1 ) ) * ( ymin-y1)+x1;
512 }
else if (y[i] > ymax) {
514 x[i] = ( ( x2-x1 ) / ( y2-y1 ) ) * ( ymax-y1)+x1;
517 if (! ( x[0] < xmin && x[1]< xmin ) && !( x[0] >xmax && x[1] >xmax )) {
537inline QLineF
JKQTPClipLine(
const QLineF& line,
double xmin ,
double xmax ,
double ymin,
double ymax) {
543 return QLineF(x1,y1,x2,y2);
560 const double xmin=qMin(clipRect.left(), clipRect.right());
561 const double xmax=qMax(clipRect.left(), clipRect.right());
562 const double ymin=qMin(clipRect.top(), clipRect.bottom());
563 const double ymax=qMax(clipRect.top(), clipRect.bottom());
570 return QLineF(x1,y1,x2,y2);
622template <
class TPa
inter>
623inline void JKQTPDrawTooltip(TPainter& painter,
double x,
double y,
const QRectF& rect);
635 std::array<QPointF, N*2> star_coords;
637 for (
int i=0; i<N; i++) {
638 const double a=(
static_cast<double>(i)+0.5)*angle;
639 star_coords[i*2]=QPointF(sin(a),cos(a));
640 star_coords[i*2+1]=QPointF(inner_radius*sin(a+angle/2.0),inner_radius*cos(a+angle/2.0));
660template <
class TPa
inter>
661inline void JKQTPPlotSymbol(TPainter& painter,
double x,
double y,
JKQTPGraphSymbols symbol,
double symbolSize,
double symbolLineWidth, QColor color, QColor fillColor, QFont symbolFont) {
663 painter.save();
auto __finalpaint=
JKQTPFinally([&painter]() {painter.restore();});
664 QPen p=painter.pen();
667 p.setStyle(Qt::SolidLine);
668 p.setCapStyle(Qt::FlatCap);
670 pDescaled.setWidthF(pDescaled.widthF()/symbolSize);
671 QFont fDescaled=symbolFont;
672 fDescaled.setPointSizeF(fDescaled.pointSizeF()/symbolSize);
673 const QBrush b=QBrush(fillColor, Qt::SolidPattern);
676 static std::vector<JKQTPSymbolPathsInternnal> all_paths = []() {
678 std::vector<JKQTPSymbolPathsInternnal> paths;
683 const auto star5cords=JKQTPGetStarCoordinates<5>(0.5);
684 const auto star6cords=JKQTPGetStarCoordinates<6>(0.5);
685 const auto star8cords=JKQTPGetStarCoordinates<8>(0.5);
695 paths[
JKQTPCircle].paths.addEllipse(QPointF(0,0), 0.5, 0.5);
717 paths[
JKQTPPeace].paths.lineTo(0.5*s45,0.5*s45);
719 paths[
JKQTPPeace].paths.lineTo(-0.5*s45,0.5*s45);
720 paths[
JKQTPTarget].paths.addEllipse(QPointF(0,0), 0.33333, 0.33333);
725 paths[
JKQTPFemale].paths.addEllipse(-0.25,-0.5,0.5,0.5);
730 paths[
JKQTPMale].paths.addEllipse(QRectF(-0.5/2.0, -0.5/2.0, 0.5, 0.5));
732 paths[
JKQTPMale].paths.lineTo(QPointF(+0.5,-0.5));
733 paths[
JKQTPMale].paths.moveTo(QPointF(+0.5-0.5/2.0,-0.5));
734 paths[
JKQTPMale].paths.lineTo(QPointF(+0.5,-0.5));
735 paths[
JKQTPMale].paths.lineTo(QPointF(+0.5,-0.5+0.5/2.0));
736 paths[
JKQTPRect].paths.addRect(-0.5,-0.5, 1,1);
771 poly<<QPointF(0.0, 0.0-0.5)<<QPointF(0.0+0.5, 0.0)<<QPointF(0.0, 0.0+0.5)<<QPointF(0.0-0.5, 0.0);
781 poly<<QPointF(0.0, 0.0-0.5)<<QPointF(0.0+0.5, 0.0)<<QPointF(0.0, 0.0+0.5)<<QPointF(0.0-0.5, 0.0);
791 for (
size_t i=0; i<star8cords.size(); i+=2) {
792 paths[
JKQTPAsterisc8].paths.moveTo(star8cords[i].x()*0.5, star8cords[i].y()*0.5);
795 for (
size_t i=0; i<star6cords.size(); i+=2) {
796 paths[
JKQTPAsterisc6].paths.moveTo(star6cords[i].x()*0.5, star6cords[i].y()*0.5);
799 for (
size_t i=0; i<star5cords.size(); i+=2) {
800 paths[
JKQTPAsterisc].paths.moveTo(star5cords[i].x()*0.5, star5cords[i].y()*0.5);
804 paths[
JKQTPRectTriangle].polygons<<QPointF(0.0-0.5, 0.0+0.5)<<QPointF(0.0, 0.0-0.5)<<QPointF(0.0+0.5, 0.0+0.5)<<QPointF(0.0-0.5, 0.0+0.5)<<QPointF(0.0-0.5, 0.0-0.5)<<QPointF(0.0+0.5, 0.0-0.5)<<QPointF(0.0+0.5, 0.0+0.5);
805 paths[
JKQTPRectDownTriangle].polygons<<QPointF(0.0-0.5, 0.0-0.5)<<QPointF(0.0, 0.0+0.5)<<QPointF(0.0+0.5, 0.0-0.5)<<QPointF(0.0-0.5, 0.0-0.5)<<QPointF(0.0-0.5, 0.0+0.5)<<QPointF(0.0+0.5, 0.0+0.5)<<QPointF(0.0+0.5, 0.0-0.5);
806 paths[
JKQTPRectLeftTriangle].polygons<<QPointF(0.0+0.5, 0.0-0.5)<<QPointF(0.0-0.5, 0.0)<<QPointF(0.0+0.5, 0.0+0.5)<<QPointF(0.0-0.5, 0.0+0.5)<<QPointF(0.0-0.5, 0.0-0.5)<<QPointF(0.0+0.5, 0.0-0.5)<<QPointF(0.0+0.5, 0.0+0.5);
807 paths[
JKQTPRectRightTriangle].polygons<<QPointF(0.0-0.5, 0.0-0.5)<<QPointF(0.0+0.5, 0.0)<<QPointF(0.0-0.5, 0.0+0.5)<<QPointF(0.0+0.5, 0.0+0.5)<<QPointF(0.0+0.5, 0.0-0.5)<<QPointF(0.0-0.5, 0.0-0.5)<<QPointF(0.0-0.5, 0.0+0.5);
808 paths[
JKQTPTriangle].polygons<<QPointF(0.0-0.5, 0.0+0.5)<<QPointF(0.0+0.5, 0.0+0.5)<<QPointF(0.0, 0.0-0.5);
810 paths[
JKQTPDownTriangle].polygons<<QPointF(0.0-0.5, 0.0-0.5)<<QPointF(0.0+0.5, 0.0-0.5)<<QPointF(0.0, 0.0+0.5);
812 paths[
JKQTPLeftTriangle].polygons<<QPointF(0.0+0.5, 0.0+0.5)<<QPointF(0.0-0.5, 0.0)<<QPointF(0.0+0.5, 0.0-0.5);
814 paths[
JKQTPRightTriangle].polygons<<QPointF(0.0-0.5, 0.0+0.5)<<QPointF(0.0+0.5, 0.0)<<QPointF(0.0-0.5, 0.0-0.5);
816 for (
size_t i=0; i<star5cords.size(); i++) {
817 paths[
JKQTPstar].polygons<<QPointF(0.0+star5cords[i].x()*0.5, 0.0+star5cords[i].y()*0.5);
818 paths[
JKQTPFilledStar].filledpolygons<<QPointF(0.0+star5cords[i].x()*0.5, 0.0+star5cords[i].y()*0.5);
820 paths[
JKQTPPentagon].polygons<<QPointF(0.0+star5cords[i].x()*0.5, 0.0+star5cords[i].y()*0.5);
821 paths[
JKQTPFilledPentagon].filledpolygons<<QPointF(0.0+star5cords[i].x()*0.5, 0.0+star5cords[i].y()*0.5);
824 for (
size_t i=0; i<star6cords.size(); i+=2) {
825 paths[
JKQTPHexagon].polygons<<QPointF(0.0+star6cords[i].x()*0.5, 0.0+star6cords[i].y()*0.5);
826 paths[
JKQTPFilledHexagon].filledpolygons<<QPointF(0.0+star6cords[i].x()*0.5, 0.0+star6cords[i].y()*0.5);
828 for (
size_t i=0; i<star8cords.size(); i+=2) {
829 paths[
JKQTPOctagon].polygons<<QPointF(0.0+star8cords[i].x()*0.5, 0.0+star8cords[i].y()*0.5);
830 paths[
JKQTPFilledOctagon].filledpolygons<<QPointF(0.0+star8cords[i].x()*0.5, 0.0+star8cords[i].y()*0.5);
832 paths[
JKQTPDiamond].polygons<<QPointF(0.0, 0.0-0.5)<<QPointF(0.0+0.5, 0.0)<<QPointF(0.0, 0.0+0.5)<<QPointF(0.0-0.5, 0.0);
834 paths[
JKQTPHourglass].polygons<<QPointF(0.0-0.5, 0.0+0.5)<<QPointF(0.0+0.5, 0.0+0.5)<<QPointF(0.0-0.5, 0.0-0.5)<<QPointF(0.0+0.5, 0.0-0.5);
836 paths[
JKQTPHorizontalHourglass].polygons<<QPointF(0.0-0.5, 0.0+0.5)<<QPointF(0.0-0.5, 0.0-0.5)<<QPointF(0.0+0.5, 0.0+0.5)<<QPointF(0.0+0.5, 0.0-0.5);
838 paths[
JKQTPSantaClauseHouse].polygons<<QPointF(0.0-0.5, 0.0+0.5)<<QPointF(0.0+0.5, 0.0+0.5)<<QPointF(0.0+0.5, 0.0-1.0/6.0)<<QPointF(0.0-0.5, 0.0-1.0/6.0)<<QPointF(0.0, 0.0-0.5)<<QPointF(0.0+0.5, 0.0-1.0/6.0)<<QPointF(0.0-0.5, 0.0+0.5)<<QPointF(0.0-0.5, 0.0-1.0/6.0)<<QPointF(0.0+0.5, 0.0+0.5);
840 paths[
JKQTPUpDownTriangle].polygons<<QPointF(0.0-0.5, 0.0+0.5)<<QPointF(0.0, 0.0+0.5)<<QPointF(0.0+0.5, 0.0-0.5)<<QPointF(0.0-0.5, 0.0-0.5)<<QPointF(0.0, 0.0+0.5)<<QPointF(0.0+0.5, 0.0+0.5)<<QPointF(0.0, 0.0-0.5)<<QPointF(0.0-0.5, 0.0+0.5);
844 paths[
JKQTPTripod].lines<<QLineF(0.0, 0.0-0.5, 0.0, 0.0)
845 <<QLineF(0.0, 0.0, 0.0-s45, 0.0+s45)
846 <<QLineF(0.0, 0.0, 0.0+s45, 0.0+s45);
849 <<QLineF(0.0, 0.0, 0.0-s45, 0.0-s45)
850 <<QLineF(0.0, 0.0, 0.0+s45, 0.0-s45);
853 <<QLineF(0.0, 0.0, 0.0+s45, 0.0-s45)
854 <<QLineF(0.0, 0.0, 0.0+s45, 0.0+s45);
857 <<QLineF(0.0, 0.0, 0.0-s45, 0.0-s45)
858 <<QLineF(0.0, 0.0, 0.0-s45, 0.0+s45);
863 painter.setBrush(QColor(Qt::transparent));
867 painter.drawPoint(QPointF(x,y));
892 painter.translate(QPointF(x,y));
893 painter.scale(symbolSize,symbolSize);
894 painter.setBrush(QColor(Qt::transparent));
895 painter.setPen(pDescaled);
896 if (all_paths[symbol].pathsrotation!=0.0) painter.rotate(all_paths[symbol].pathsrotation);
897 painter.drawPath(all_paths[symbol].paths);
908 painter.translate(QPointF(x,y));
909 painter.scale(symbolSize,symbolSize);
911 painter.setPen(pDescaled);
912 if (all_paths[symbol].pathsrotation!=0.0) painter.rotate(all_paths[symbol].pathsrotation);
913 painter.drawPath(all_paths[symbol].filledpaths);
936 painter.translate(QPointF(x,y));
937 painter.scale(symbolSize,symbolSize);
938 painter.setBrush(QColor(Qt::transparent));
939 painter.setPen(pDescaled);
940 if (all_paths[symbol].pathsrotation!=0.0) painter.rotate(all_paths[symbol].pathsrotation);
941 painter.drawConvexPolygon(all_paths[symbol].polygons);
959 painter.translate(QPointF(x,y));
960 painter.scale(symbolSize,symbolSize);
962 painter.setPen(pDescaled);
963 if (all_paths[symbol].pathsrotation!=0.0) painter.rotate(all_paths[symbol].pathsrotation);
964 painter.drawConvexPolygon(all_paths[symbol].filledpolygons);
973 painter.translate(QPointF(x,y));
974 painter.scale(symbolSize,symbolSize);
975 painter.setBrush(QColor(Qt::transparent));
976 painter.setPen(pDescaled);
977 if (all_paths[symbol].pathsrotation!=0.0) painter.rotate(all_paths[symbol].pathsrotation);
978 painter.drawLines(all_paths[symbol].lines);
991 symbolFont.setStyleStrategy(QFont::PreferDefault);
993 const QFontMetricsF fm(symbolFont);
994 const QRectF tbr=fm.tightBoundingRect(ch);
995 const double scale=symbolSize/qMax(tbr.width(), tbr.height());
996 painter.translate(QPointF(x,y));
999 painter.scale(scale,scale);
1003 painter.translate(-tbr.center());
1007 painter.setBrush(color);
1008 painter.setPen(Qt::NoPen);
1010 path.addText(0,0,symbolFont, ch),
1011 painter.drawPath(path);
1014 symbolFont.setStyleStrategy(QFont::PreferDefault);
1016 const QFontMetricsF fm(symbolFont);
1017 const QRectF tbr=fm.tightBoundingRect(ch);
1018 const double scale=symbolSize/qMax(tbr.width(), tbr.height());
1020 painter.translate(QPointF(x,y));
1021 painter.scale(scale,scale);
1022 painter.translate(-tbr.center());
1023 painter.setBrush(b);
1025 path.addText(0,0,symbolFont, ch),
1026 painter.drawPath(path);
1031 if (idx>=0 && idx<JKQTPlotterDrawingTools::JKQTPCustomGraphSymbolStore->size()) {
1033 painter.translate(QPointF(x,y));
1034 painter.scale(symbolSize,symbolSize);
1035 painter.setBrush(b);
1036 painter.setPen(pDescaled);
1043template <
class TPa
inter>
1048 poly<<rect.topLeft()<<QPointF(rect.left()+rect.width()/3, rect.top())<<QPointF(x,y)<<QPointF(rect.right()-rect.width()/3, rect.top())<< rect.topRight()<<rect.bottomRight()<<rect.bottomLeft()<<rect.topLeft();
1049 painter.drawPolygon(poly);
1050 }
else if (y>rect.bottom()) {
1051 poly<<rect.topLeft()<<rect.topRight()<<rect.bottomRight()<<QPointF(rect.right()-rect.width()/3, rect.bottom())<<QPointF(x,y)<<QPointF(rect.left()+rect.width()/3, rect.bottom())<< rect.bottomLeft()<<rect.topLeft();
1052 painter.drawPolygon(poly);
1053 }
else if (x<rect.left()) {
1054 poly<<QPointF(x,y)<<rect.topLeft()<<rect.topRight()<<rect.bottomRight()<<rect.bottomLeft()<<QPointF(rect.left(), rect.top()+rect.height()/2)<<QPointF(x,y);
1055 painter.drawPolygon(poly);
1056 }
else if (x>rect.left()) {
1057 poly<<rect.topLeft()<<rect.topRight()<<QPointF(x,y)<<QPointF(rect.right(), rect.top()+rect.height()/2)<<rect.bottomRight()<<rect.bottomLeft()<<rect.topLeft();
1058 painter.drawPolygon(poly);
1060 painter.drawRect(rect);
1064template <
class TPa
inter>
1066 const double angle1=atan2(l.p2().y()-l.p1().y(), l.p2().x()-l.p1().x());
1067 const double angle2=atan2(l.p1().y()-l.p2().y(), l.p1().x()-l.p2().x());
1068 QPointF lx1=l.p1(), lx2=l.p2();
1072 painter.drawLine(QLineF(lx1, lx2));
1077template <
class TPa
inter>
1079 if (line_start) *line_start=QPointF(x,y);
1081 static double tan__default_theta_open_tip=tan(default_theta_open_tip);
1083 static double tan__default_theta_closed_tip=tan(default_theta_closed_tip);
1084 QPen pinit=painter.pen();
1085 pinit.setCapStyle(Qt::FlatCap);
1086 pinit.setJoinStyle(Qt::RoundJoin);
1090 painter.save();
auto __finalpaint=
JKQTPFinally([&painter]() {painter.restore();});
1091 painter.translate(x,y);
1098 const QPointF poly[3] = {
1099 QPointF(size, -tan__default_theta_open_tip*size),
1101 QPointF(size, tan__default_theta_open_tip*size)
1103 painter.setPen(pinit);
1104 if (style==
JKQTPArrowAndBar) painter.drawLine(QPointF(0,-tan__default_theta_open_tip*size), QPointF(0,tan__default_theta_open_tip*size));
1105 painter.drawPolyline(poly, 3);
1109 painter.setPen(pinit);
1110 if (style==
JKQTPHarpoonDecoratorAndBar) painter.drawLine(QPointF(0,-tan__default_theta_open_tip*size), QPointF(0,tan__default_theta_open_tip*size));
1111 painter.drawLine(QPointF(0,0), QPointF(size, tan__default_theta_open_tip*size));
1115 const QPointF poly[3] = {
1116 QPointF(size, -tan__default_theta_open_tip*size),
1118 QPointF(size, tan__default_theta_open_tip*size)
1120 painter.setPen(pinit);
1121 if (style==
JKQTPDoubleArrowAndBar) painter.drawLine(QPointF(0,-tan__default_theta_open_tip*size), QPointF(0,tan__default_theta_open_tip*size));
1122 painter.drawPolyline(poly, 3);
1123 painter.translate(4.0*pinit.widthF(),0);
1124 painter.drawPolyline(poly, 3);
1125 if (line_start) *line_start=QPointF(x,y)+QPointF(4.0*pinit.widthF()*cos(angle_rad),4.0*pinit.widthF()*sin(angle_rad));
1129 const QPointF poly[4] = {
1131 QPointF(size, tan__default_theta_closed_tip*size),
1132 QPointF(0.75*size,0),
1133 QPointF(size, -tan__default_theta_closed_tip*size)
1135 painter.drawPolygon(poly, 4);
1137 painter.translate(0.5*size, 0);
1138 painter.drawPolygon(poly, 4);
1139 if (line_start) *line_start=QPointF(x,y)+QPointF(1.25*size*cos(angle_rad),1.25*size*sin(angle_rad));
1141 if (line_start) *line_start=QPointF(x,y)+QPointF(0.75*size*cos(angle_rad),0.75*size*sin(angle_rad));
1147 const QPointF poly[3] = {
1148 QPointF(size, -tan__default_theta_closed_tip*size),
1150 QPointF(size, tan__default_theta_closed_tip*size)
1152 painter.setBrush(Qt::NoBrush);
1153 painter.setPen(pinit);
1154 painter.drawConvexPolygon(poly, 3);
1155 if (style==
JKQTPTriangleDecoratorAndBar) painter.drawLine(QPointF(0,-tan__default_theta_closed_tip*size), QPointF(0,tan__default_theta_closed_tip*size));
1156 if (line_start) *line_start=QPointF(x,y)+QPointF(size*cos(angle_rad),size*sin(angle_rad));
1161 const QPointF poly[3] = {
1162 QPointF(size, -tan__default_theta_closed_tip*size),
1164 QPointF(size, tan__default_theta_closed_tip*size)
1167 painter.drawConvexPolygon(poly, 3);
1169 painter.setPen(pinit);
1170 painter.drawLine(QPointF(0,-tan__default_theta_closed_tip*size), QPointF(0,tan__default_theta_closed_tip*size));
1172 if (line_start) *line_start=QPointF(x,y)+QPointF(size*cos(angle_rad),size*sin(angle_rad));
1178 const QPointF poly[4] = {
1180 QPointF(size/2.0, -tan__default_theta_closed_tip*size),
1182 QPointF(size/2.0, tan__default_theta_closed_tip*size)
1184 painter.setBrush(Qt::NoBrush);
1185 painter.setPen(pinit);
1186 painter.drawConvexPolygon(poly, 4);
1187 if (style==
JKQTPDiamondDecoratorAndBar) painter.drawLine(QPointF(0,-tan__default_theta_closed_tip*size), QPointF(0,tan__default_theta_closed_tip*size));
1188 if (line_start) *line_start=QPointF(x,y)+QPointF(size*cos(angle_rad),size*sin(angle_rad));
1193 const QPointF poly[4] = {
1195 QPointF(size/2.0, -tan__default_theta_closed_tip*size),
1197 QPointF(size/2.0, tan__default_theta_closed_tip*size)
1200 painter.drawConvexPolygon(poly, 4);
1202 painter.setPen(pinit);
1203 painter.drawLine(QPointF(0,-tan__default_theta_closed_tip*size), QPointF(0,tan__default_theta_closed_tip*size));
1205 if (line_start) *line_start=QPointF(x,y)+QPointF(size*cos(angle_rad),size*sin(angle_rad));
1211 painter.setBrush(Qt::NoBrush);
1212 painter.setPen(pinit);
1216 painter.drawEllipse(QRectF(0,-size/2.0,size,size));
1217 if (line_start) *line_start=QPointF(x,y)+QPointF(size*cos(angle_rad),size*sin(angle_rad));
1223 painter.setBrush(Qt::NoBrush);
1224 painter.setPen(pinit);
1228 painter.drawRect(QRectF(0,-size/2.0,size,size));
1229 if (line_start) *line_start=QPointF(x,y)+QPointF(size*cos(angle_rad),size*sin(angle_rad));
1233 painter.setPen(pinit);
1234 painter.drawLine(QPointF(0,-tan__default_theta_open_tip*size), QPointF(0,tan__default_theta_open_tip*size));
1238 painter.setPen(pinit);
1239 painter.drawLine(QPointF(0,0), QPointF(0,tan__default_theta_open_tip*size));
1243 painter.setPen(pinit);
1244 painter.drawLine(QPointF(0.25*size,-tan__default_theta_open_tip*size), QPointF(-0.25*size,tan__default_theta_open_tip*size));
1248 const QPointF poly[4] = {
1249 QPointF(-size*0.2,-tan__default_theta_open_tip*size),
1250 QPointF(0,-tan__default_theta_open_tip*size),
1251 QPointF(0,tan__default_theta_open_tip*size),
1252 QPointF(-size*0.2, tan__default_theta_open_tip*size)
1254 painter.setPen(pinit);
1255 painter.drawPolyline(poly, 4);
this class extends the QPainter
Definition jkqtpenhancedpainter.h:33
template class that wraps any datatype and combines it with a mutex, exposes the lock()/unlock() inte...
Definition jkqtpconcurrencytools.h:40
internal datastructure used in JKQTPPlotSymbol() to precalculate certain data only once per runtime
Definition jkqtpdrawingtools.h:649
QPainterPath filledpaths
Definition jkqtpdrawingtools.h:652
QVector< QLineF > lines
Definition jkqtpdrawingtools.h:653
QPolygonF polygons
Definition jkqtpdrawingtools.h:654
JKQTPSymbolPathsInternnal()
Definition jkqtpdrawingtools.h:650
qreal pathsrotation
Definition jkqtpdrawingtools.h:656
QPainterPath paths
Definition jkqtpdrawingtools.h:651
QPolygonF filledpolygons
Definition jkqtpdrawingtools.h:655