C++ (Qt)QPointF margin(x, (p1.y() * (x - p0.x()) + p0.y() * (p1.x() - x)) / (p1.x() - p0.x()));
QList<кривые, хранящих точки>model_->getData(QRect ); //QRect - область видимости View.
C++ (Qt)struct BepecView { void Draw1Point( const QPointF & src ) const; // рисует 1 точку, src в координатах модели void DrawPoints( const QPointF * pt, int count ); qreal mX0, mX1, mY0, mY1; // размер окна в координатах модели qreal mScaleX, mScaleY; // масштабы по осям ..}; void BepecView::DrawPoints( const QPointF * pt, int count );{ QPointF prv; Draw1Point(pt[0]); // всегда рисуем первую точку for (int i = 1; i < count; ++i) { const QPointF & nxt = pt[i]; qreal prvX = prv.x(); qreal prvY = prv.y(); qreal nxtX = nxt.x(); qreal nxtY = nxt.y(); if (nxtX - prvX < 1.0f / mScaleX) continue; // прореживание // пересечение слева if (prvX <= mX0 && nxtX >= mX0) Draw1Point(LerpX(prv, nxt, mX0)); // пересечение сверху if (qMin(prvY, nxtY) <= mY1 && qMax(prvY, nxtY) >= mY1) Draw1Point(LerpY(prv, nxt, mY1)); // пересечение снизу if (qMin(prvY, nxtY) <= mY0 && qMax(prvY, nxtY) >= mY0) Draw1Point(LerpY(prv, nxt, mY0)); // пересечение справа if (prvX <= mX1 && nxtX >= mX1) Draw1Point(LerpX(prv, nxt, mX1)); // рисуем саму точку и делаем ее текущей Draw1Point(nxt); prv = nxt; } // всегда рисуем последнюю точку if (prv != pt[count - 1]) Draw1Point(pt[count - 1]); }