void Mesh::elementCentroid(int elemIndex, double& cx, double& cy) const { const Element& e = mElems[elemIndex]; if (e.eType() == Element::ENP) { const Node* nodes = projectedNodes(); QPolygonF pX(e.nodeCount()); for (int i=0; i<e.nodeCount(); i++) { pX[i] = nodes[e.p(i)].toPointF(); } ENP_centroid(pX, cx, cy); } else if (e.eType() == Element::E4Q) { int e4qIndex = mE4QtmpIndex[elemIndex]; E4Qtmp& e4q = mE4Qtmp[e4qIndex]; E4Q_centroid(e4q, cx, cy, *mE4Qnorm); } else if (e.eType() == Element::E3T) { const Node* nodes = projectedNodes(); E3T_centroid(nodes[e.p(0)].toPointF(), nodes[e.p(1)].toPointF(), nodes[e.p(2)].toPointF(), cx, cy); } else if (e.eType() == Element::E2L) { const Node* nodes = projectedNodes(); E2L_centroid(nodes[e.p(0)].toPointF(), nodes[e.p(1)].toPointF(), cx, cy); } else Q_ASSERT(0 && "element not supported"); }
clsparseStatus cldenseDaxpy(cldenseVector *r, const clsparseScalar *alpha, const cldenseVector *x, const cldenseVector *y, const clsparseControl control) { if (!clsparseInitialized) { return clsparseNotInitialized; } //check opencl elements if (control == nullptr) { return clsparseInvalidControlObject; } clsparse::vector<cl_double> pR (control, r->values, r->num_values); clsparse::vector<cl_double> pAlpha(control, alpha->value, 1); clsparse::vector<cl_double> pX (control, x->values, x->num_values); clsparse::vector<cl_double> pY (control, y->values, y->num_values); assert(pR.size() == pY.size()); assert(pR.size() == pX.size()); cl_ulong size = pR.size(); if(size == 0) return clsparseSuccess; //nothing to do if (pAlpha[0] == 0.0) { auto pRBuff = pR.data()(); auto pYBuff = pY.data()(); //if R is different pointer than Y than copy Y to R if (pRBuff != pYBuff) { // deep copy; pR = pY; } return clsparseSuccess; } return axpy(pR, pAlpha, pX, pY, control); }
bool Mesh::interpolateElementCentered(uint elementIndex, double x, double y, double* value, const ElementOutput* output, const ValueAccessor* accessor) const { const Mesh* mesh = output->dataSet->mesh(); const Element& elem = mesh->elements()[elementIndex]; if (elem.eType() == Element::ENP) { const Node* nodes = projectedNodes(); QPolygonF pX(elem.nodeCount()); QVector<double> lam(elem.nodeCount()); for (int i=0; i<elem.nodeCount(); i++) { pX[i] = nodes[elem.p(i)].toPointF(); } if (!ENP_physicalToLogical(pX, QPointF(x, y), lam)) return false; *value = accessor->value(elementIndex); return true; } else if (elem.eType() == Element::E4Q) { int e4qIndex = mE4QtmpIndex[elementIndex]; E4Qtmp& e4q = mE4Qtmp[e4qIndex]; double Lx, Ly; if (!E4Q_mapPhysicalToLogical(e4q, x, y, Lx, Ly, *mE4Qnorm)) return false; if (Lx < 0 || Ly < 0 || Lx > 1 || Ly > 1) return false; *value = accessor->value(elementIndex); return true; } else if (elem.eType() == Element::E3T) { const Node* nodes = projectedNodes(); double lam1, lam2, lam3; if (!E3T_physicalToBarycentric(nodes[elem.p(0)].toPointF(), nodes[elem.p(1)].toPointF(), nodes[elem.p(2)].toPointF(), QPointF(x, y), lam1, lam2, lam3)) return false; // Now interpolate *value = accessor->value(elementIndex); return true; } else if (elem.eType() == Element::E2L) { const Node* nodes = projectedNodes(); double lam; if (!E2L_physicalToLogical(nodes[elem.p(0)].toPointF(), nodes[elem.p(1)].toPointF(), QPointF(x, y), lam)) return false; // Now interpolate *value = accessor->value(elementIndex); return true; } else { Q_ASSERT(0 && "unknown element type"); return false; } }
bool Mesh::interpolate(uint elementIndex, double x, double y, double* value, const NodeOutput* output, const ValueAccessor* accessor) const { const Mesh* mesh = output->dataSet->mesh(); const Element& elem = mesh->elements()[elementIndex]; if (elem.eType() == Element::ENP) { const Node* nodes = projectedNodes(); QPolygonF pX(elem.nodeCount()); QVector<double> lam(elem.nodeCount()); for (int i=0; i<elem.nodeCount(); i++) { pX[i] = nodes[elem.p(i)].toPointF(); } if (!ENP_physicalToLogical(pX, QPointF(x, y), lam)) return false; *value = 0; for (int i=0; i<elem.nodeCount(); i++) { *value += lam[i] * accessor->value( elem.p(i) ); } return true; } else if (elem.eType() == Element::E4Q) { int e4qIndex = mE4QtmpIndex[elementIndex]; E4Qtmp& e4q = mE4Qtmp[e4qIndex]; double Lx, Ly; if (!E4Q_mapPhysicalToLogical(e4q, x, y, Lx, Ly, *mE4Qnorm)) return false; if (Lx < 0 || Ly < 0 || Lx > 1 || Ly > 1) return false; double q11 = accessor->value( elem.p(2) ); double q12 = accessor->value( elem.p(1) ); double q21 = accessor->value( elem.p(3) ); double q22 = accessor->value( elem.p(0) ); *value = q11*Lx*Ly + q21*(1-Lx)*Ly + q12*Lx*(1-Ly) + q22*(1-Lx)*(1-Ly); return true; } else if (elem.eType() == Element::E3T) { /* So - we're interpoalting a 3-noded triangle The query point must be within the bounding box of this triangl but not nessisarily within the triangle itself. */ /* First determine if the point of interest lies within the triangle using Barycentric techniques described here: http://www.blackpawn.com/texts/pointinpoly/ */ const Node* nodes = projectedNodes(); double lam1, lam2, lam3; if (!E3T_physicalToBarycentric(nodes[elem.p(0)].toPointF(), nodes[elem.p(1)].toPointF(), nodes[elem.p(2)].toPointF(), QPointF(x, y), lam1, lam2, lam3)) return false; // Now interpolate double z1 = accessor->value( elem.p(0)); double z2 = accessor->value( elem.p(1)); double z3 = accessor->value( elem.p(2)); *value = lam1 * z3 + lam2 * z2 + lam3 * z1; return true; } else if (elem.eType() == Element::E2L) { /* So - we're interpoalting a 2-noded line */ const Node* nodes = projectedNodes(); double lam; if (!E2L_physicalToLogical(nodes[elem.p(0)].toPointF(), nodes[elem.p(1)].toPointF(), QPointF(x, y), lam)) return false; // Now interpolate double z1 = accessor->value( elem.p(0) ); double z2 = accessor->value( elem.p(1) ); *value = z1 + lam * (z2 - z1); return true; } else { Q_ASSERT(0 && "unknown element type"); return false; } }
/* Verify that offsetof warns if given a non-standard-layout class */ /* Copyright (C) 2003 Free Software Foundation, Inc. */ /* Contributed by Matt Austern <*****@*****.**> 15 May 2003 */ /* { dg-do compile } */ struct X { int x, y; protected: int z; }; typedef X* pX; typedef __SIZE_TYPE__ size_t; size_t yoff = size_t(&(pX(0)->y)); /* { dg-warning "invalid access" "" } */ /* { dg-warning "macro was used incorrectly" "macro" { target *-*-* } 16 } */
// 曲线绘制. void DataGrids::DrawCurve(void) { #define SHOW_LOWLEVEL 0 #define X(_x) UserX((_x)+xMarginLeft) #define Y(_y) UserY((_y)+yMarginDown) WideString strList[] = { L"Vl(低电平电压)", L"Vh(高电平电压)", L"Tr(上升沿)", L"Th(高电平)", L"Tf(下降沿)", L"Tl(低电平)", }; Gdiplus::SolidBrush solidBrush(Gdiplus::Color(255, 0, 0, 255)); Gdiplus::Pen pX(Gdiplus::Color(255, 0, 0, 0),1); Gdiplus::AdjustableArrowCap cap(8,6,true); Gdiplus::Font font(L"Times New Roman",8); Gdiplus::SolidBrush s( Gdiplus::Color(255, 0, 0, 0)); Gdiplus::PointF *pComm = new Gdiplus::PointF[4]; // 有上升.下降沿的斜坡. Gdiplus::Pen p(Gdiplus::Color(255, 0, 0, 255),2); //先将点计算好. Gdiplus::PointF *points = new Gdiplus::PointF[10]; // 低电平位置为可用高度的 %20. // 高电平位置位可用高度的 %80. // 占空比位%50. // 上升沿/下降沿使用的%5的位置. // 低电平先开始. // 开始区域.(xMarkHeight + 20 , yMarksHeigh + 20). // 结束区域.(width - 20, heigh - 20). double fLvPos = 0.1 + 0.1 * m_fLRatio / 100, fHvPos = 0.4 + 0.4 * m_fHRatio/100, fHvLen = (m_fDuty*0.8/100.0), fLvLen = ((100-m_fDuty)*0.8/100), fRiseLen = 0.05,fFallLen= 0.05; double xMarginLeft = xMarkHeight + 30; double yMarginDown = yMarkHeight + 20; double xMarginRight = 20; double yMarginTop = 20; double RealWidth = m_iWidth - xMarginLeft - xMarginRight; double RealHeight = m_iHeight - yMarginDown - yMarginTop; int idx = 0; points[idx++] = Gdiplus::PointF((int)X(0),(int)Y(fLvPos * RealHeight)); points[idx++] = Gdiplus::PointF((int)X(fHvLen * RealWidth),(int)Y(fLvPos * RealHeight)); points[idx++] = Gdiplus::PointF((int)X((fHvLen + fRiseLen)* RealWidth),(int)Y(fHvPos * RealHeight)); points[idx++] = Gdiplus::PointF((int)X((fHvLen + fRiseLen + fLvLen)* RealWidth),(int)Y(fHvPos * RealHeight)); points[idx++] = Gdiplus::PointF((int)X((fHvLen + fRiseLen + fLvLen + fFallLen)* RealWidth),(int)Y(fLvPos * RealHeight)); points[idx++] = Gdiplus::PointF((int)X(RealWidth),(int)Y(fLvPos * RealHeight)); m_stGrp->DrawLines(&p,points,idx); //设置位虚线. pX.SetDashStyle(Gdiplus::DashStyleDash); pX.SetAlignment(Gdiplus::PenAlignmentCenter); pX.SetDashOffset(20.0); // P0 起点. P1 上升沿的起点. P2上升沿结束点. P3 下降沿起点. P4 下降沿的结束点. P5 结束点. #if SHOW_LOWLEVEL pComm[0].X = (int)points[0].X; pComm[0].Y = (int)points[0].Y; pComm[1].X = pComm[0].X; pComm[1].Y = UserY(m_iHeight - yMarginTop); m_stGrp->DrawLines(&pX,pComm,2); #endif pComm[0].X = (int)points[1].X; pComm[0].Y = (int)points[1].Y; pComm[1].X = pComm[0].X; pComm[1].Y = UserY(m_iHeight - yMarginTop); m_stGrp->DrawLines(&pX,pComm,2); pComm[0].X = (int)points[2].X; pComm[0].Y = (int)points[2].Y; pComm[1].X = pComm[0].X; pComm[1].Y = UserY(m_iHeight - yMarginTop - 35); m_stGrp->DrawLines(&pX,pComm,2); pComm[0].X = (int)points[3].X; pComm[0].Y = (int)points[3].Y; pComm[1].X = pComm[0].X; pComm[1].Y = UserY(m_iHeight - yMarginTop - 35); m_stGrp->DrawLines(&pX,pComm,2); pComm[0].X = (int)points[4].X; pComm[0].Y = (int)points[4].Y; pComm[1].X = pComm[0].X; pComm[1].Y = UserY(m_iHeight - yMarginTop); m_stGrp->DrawLines(&pX,pComm,2); // 准备画笔的箭头. cap.SetFillState(false); pX.SetCustomEndCap(&cap); pX.SetCustomStartCap(&cap); // Vl -- .P0~P1中点位置开始.到轴线上--双箭头. pComm[0].X = (int)(points[0].X + points[1].X) / 2; pComm[0].Y = (int)points[0].Y; pComm[1].X = pComm[0].X; pComm[1].Y = UserY(xAxisOffset); m_stGrp->DrawLines(&pX,pComm,2); m_stGrp->DrawString(strList[0].c_bstr(),strList[0].Length(),&font,Gdiplus::PointF(pComm[0].X + 10 ,(pComm[0].Y + pComm[1].Y)/2),&s); // Vh -- .P2~P3中点位置开始.到轴线上--双箭头. // 高电平线. pComm[0].X = (int)(points[2].X + points[3].X) / 2; pComm[0].Y = (int)points[2].Y; pComm[1].X = pComm[0].X; pComm[1].Y = UserY(xAxisOffset); m_stGrp->DrawLines(&pX,pComm,2); m_stGrp->DrawString(strList[1].c_bstr(),strList[1].Length(),&font,Gdiplus::PointF(pComm[0].X + 10 ,(pComm[0].Y + pComm[1].Y)/2),&s); // #if SHOW_LOWLEVEL pComm[0].X = points[0].X; pComm[0].Y = UserY(m_iHeight - yMarginTop - 30); pComm[1].X = points[1].X; pComm[1].Y = UserY(m_iHeight - yMarginTop - 30); m_stGrp->DrawLines(&pX,pComm,2); m_stGrp->DrawString(strList[5].c_bstr(),strList[5].Length(),&font,Gdiplus::PointF((pComm[0].X + pComm[1].X)/2 -30 , pComm[0].Y + 10 ),&s); #endif pComm[0].X = points[1].X; pComm[0].Y = UserY(m_iHeight - yMarginTop - 40); pComm[1].X = points[2].X; pComm[1].Y = UserY(m_iHeight - yMarginTop - 40); m_stGrp->DrawLines(&pX,pComm,2); m_stGrp->DrawString(strList[2].c_bstr(),strList[2].Length(),&font,Gdiplus::PointF(pComm[0].X + 5 , pComm[0].Y - 30 ),&s); pComm[2].X = points[3].X; pComm[2].Y = UserY(m_iHeight - yMarginTop - 40); pComm[3].X = points[4].X; pComm[3].Y = UserY(m_iHeight - yMarginTop - 40); m_stGrp->DrawLines(&pX,pComm+2,2); m_stGrp->DrawString(strList[4].c_bstr(),strList[4].Length(),&font,Gdiplus::PointF(pComm[2].X - 30 , pComm[2].Y - 20 ),&s); pComm[1].Y = pComm[1].Y + 10; pComm[2].Y = pComm[1].Y; m_stGrp->DrawLines(&pX,pComm+1,2); m_stGrp->DrawString(strList[3].c_bstr(),strList[3].Length(),&font,Gdiplus::PointF((pComm[1].X + pComm[2].X)/2 - 30, pComm[2].Y + 15 ),&s); delete points; delete pComm; #undef X(_x) #undef Y(_y) }
/* Verify that -Wno-invalid-offsetof disables warning */ /* Copyright (C) 2003 Free Software Foundation, Inc. */ /* Contributed by Matt Austern <*****@*****.**> 15 May 2003 */ /* { dg-do compile } */ /* { dg-options "-Wno-invalid-offsetof" } */ struct X { X() : x(3), y(4) { } int x, y; }; typedef X* pX; typedef __SIZE_TYPE__ size_t; size_t yoff = size_t(&(pX(0)->y));
void TILE :: display() { draw_at(pX(),pY()); }