ObjectARX, AutoCAD. Среда программирования библиотеки C++

         

Пример 4: Вычисление Круга, чтобы Рисовать


Следующий пример рисует круг модуля, центрированный в начале координат. Точный рисовавший круг зависит от взгляда области просмотра круга. Цель состоит в том, чтобы рисовать круг с полилинией, которая имеет минимальное число заметных долей. С командой VPORTS, Вы можете создавать четыре области просмотра и затем нажимать на один и раскрывать на круге, затем нажимать на другой и копировать от этого. Когда Вы REGENALL, каждая область просмотра вычисляет ее собственный минимально сегментированное представление полилинии круга.

Это - то, как пример вычисляет необходимое число долей линии в полилинии. Сначала, учитывая круг данного радиуса, который центрирован в начале координат и расположен в XY плане, и дан вертикальную линию, которая пересекает X ось в радиусе - 0.5 пикселов, определять угол между X осью и долей линии, которая простирается от начала координат к сути, где вертикальная линия пересекает круг. Два pi разделенный этим углом обеспечивает минимальное число долей, необходимых полилинией, чтобы напомнить круг. Пользователь не будет способен дифференцировать индивидуальные доли линии, которые составляют круг, потому что визуальные различия - меньше чем пиксел.

Adesk::Boolean

AsdkTesselateSamp::worldDraw(AcGiWorldDraw *pW)

{

// Draw a red 1x1 drawing-unit square centered at the

// world coordinate origin and parallel to the XY-plane.

//

const Adesk::UInt32 num_pts = 5;

AcGePoint3d verts[num_pts];

verts[0] = verts[4] = AcGePoint3d(-0.5, -0.5, 0.0);

verts[1] = AcGePoint3d( 0.5, -0.5, 0.0);

verts[2] = AcGePoint3d( 0.5, 0.5, 0.0);

verts[3] = AcGePoint3d(-0.5, 0.5, 0.0);

pW->subEntityTraits().setColor(kRed);

pW->geometry().polyline(num_pts, verts);

// If regenType is kAcGiSaveWorldDrawForProxy, return

// Adesk::kTrue, otherwise return Adesk::kFalse to trigger

// calls to viewportDraw().

//

return (pW->regenType() == kAcGiSaveWorldDrawForProxy);

}

void

AsdkTesselateSamp::viewportDraw(AcGiViewportDraw *pV)

{

static double two_pi = atan(1.0) * 8.0;




Содержание  Назад  Вперед