Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Fortran > Графика, рисование


Автор: JohnBonJovi 23.11.2012, 12:39
Доброго дня.
Одной из задач было нарисовать аэродинамический профиль состоящий из дуг окружностей. Нарисовать - нарисовал, но ламерски, из точек, слившихся в линии. Требуется все же соединить точки линиями, тоесть получить ломанную, ее части понадобятся в расчетах далее.

Код подпрограммы рисования:

Код

subroutine ris  (N, xc, c, b, lz, betaz)
use dflib
integer status2, XE, YE, k, x1, y1, x2, y2, N
real  xc, c, b, xc1, c1, b1,lz1, r1, r2, x, y, lz, betaz, xz, yz
type (windowconfig) wc
type (xycoord) xy

status2 = setbkcolor(1)
call clearscreen($gclearscreen)
res = getwindowconfig (wc)
XE = wc.numxpixels
YE = wc.numypixels

status2 = setcolor(10)

xc1=xc/b
c1=c/b
b1=b/b 
lz1=lz/b
betaz=90-betaz


k=800*YE/XE

    r1=(((xc1)**2)/c1)+c1*0.25 !носик
    r2=(((1-xc1)**2)/c1)+c1*0.25 !хвостик

status2=setcolor(13)
status2=setpixel((XE/2)-(b1*k/2)+(xc1*k),YE/2)
status2=setpixel((XE/2)-(b1*k/2)+(xc1*k),(YE/2)-(c1*k/2))
status2=setpixel((XE/2)-(b1*k/2)+(xc1*k),(YE/2)+(c1*k/2))
status2=setpixel((XE/2)-(b1*k/2),YE/2)
status2=setpixel((XE/2)+(b1*k/2),YE/2)
status2=setpixel((XE/2)+(b1*k/2),YE/2)
status2=setpixel((XE/2)+(b1*k/2)-(lz1*k),(YE/2))
status2=setpixel((XE/2)+(b1*k/2)-lz1*k-(lz1*sind(-betaz)*k),(YE/2)+(lz1*cosd(betaz)*k))

    do x = 0, xc1, b1/N    ! носик-низ
    status2= setcolor(0)
    y=0.5*c1-r1+((r1**2)-(x-xc1)**2)**0.5

    x1=x*k+(XE/2)-(b1*k/2)
    y1=y*k+YE/2

    status2=setpixel(x1,y1)

    enddo
    do x = xc1, b1, b1/N    ! хвостик-низ
    status2= setcolor(7)
    y=0.5*c1-r2+((r2**2)-(x-xc1)**2)**0.5

    x1=x*k+(XE/2)-(b1*k/2)
    y1=y*k+YE/2

    status2=setpixel(x1,y1)
    enddo

    do x = xc1, b1, b1/N    !хвостик-верх
    status2= setcolor(0)
    y=0.5*c1-r2+((r2**2)-(x-xc1)**2)**0.5

    x1=x*k+(XE/2)-(b1*k/2)
    y1=-y*k+YE/2

    status2=setpixel(x1,y1)
    enddo

    do x = 0, xc1, b1/N    !носик-верх
    status2= setcolor(7)
    y=0.5*c1-r1+((r1**2)-(x-xc1)**2)**0.5

    x1=x*k+(XE/2)-(b1*k/2)
    y1=-y*k+YE/2

    status2=setpixel(x1,y1)

    enddo

    end subroutine


http://s1.ipicture.ru/

Если в одном из циклов заменить status2=setpixel(x1,y1) на call moveto(x1, y1, xy); status2=lineto(x1,y1) то линия будет проведена из начала координат в вычисленную точку. Вот вроде не так сложно, но моих навыков не хватает, прошу помощи)

Автор: FCM 23.11.2012, 13:09
 см. пример в системе помощи для функций семейства LINETO

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)