You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

77 lines
1.5 KiB
C

1 month ago
#pragma once
#include "SigmaDoc.h"
#include "DrawOperator/Xy.h"
#include <cassert>
/**
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>·<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
class CurveNodeDrawer
{
public:
CurveNodeDrawer(CSigmaDoc* pDoc)
: m_pDoc(pDoc)
{
assert(m_pDoc != nullptr);
}
void Draw(CDC* pDC, CPositionList& positions) const
{
if (pDC == nullptr)
{
return;
}
CSize size = m_pDoc->GetHandleSize();
POSITION pos = positions.GetHeadPosition();
while (pos != nullptr)
{
POSITION pt = positions.GetNext(pos);
COne* pOne = m_pDoc->m_pXy->GetAt(pt);
if (pOne == nullptr)
{
continue;
}
if (pOne->GetType() != DOUBLEFOX_CURVE)
{
continue;
}
CCurveEx* pCurve = pOne->GetValueSafe<CCurveEx>();
DrawSingleNode(pDC, pCurve, size);
}
}
private:
// <20><><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽ڵ㣨<DAB5><E3A3A8><EFBFBD>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD>߼<EFBFBD><DFBC><EFBFBD>
void DrawSingleNode(CDC* pDC, CCurveEx* pCurve, const CSize& handleSize) const
{
CSize sz = m_pDoc->GetHandleSize();
int lastDrawIndex = 0;
for (int i = 0; i < pCurve->num; i++)
{
CPoint pt1 = m_pDoc->GetDC().GetScreen(pCurve->x[i], pCurve->y[i]);
if (i == 0 || i == pCurve->num - 1)
{
m_pDoc->DrawHandle(pCurve->x[i], pCurve->y[i], TRACKER_NO_EDIT, pDC);
}
else
{
CPoint pt2 = m_pDoc->GetDC().GetScreen(pCurve->x[lastDrawIndex], pCurve->y[lastDrawIndex]);
if (abs(pt1.x - pt2.x) > sz.cx || abs(pt1.y - pt2.y) > sz.cy)
{
m_pDoc->DrawHandle(pCurve->x[i], pCurve->y[i], TRACKER_NO_EDIT, pDC);
lastDrawIndex = i;
}
}
}
}
CSigmaDoc* m_pDoc = nullptr;
};