le
Настольная книга по проектированию парапланов
Глава 5. Расчет плоских панелей
 

5.1 Введение
5.2 Описание LE метода
5.3 Аналитический геометрчиеский принцип
5.4 FORTRAN программа

5.1 Введение

Эта глава описывает математический метод построения плоских панелей верхней и нижней поверхности секций.

Некоторые конструкторы используют 3D редакторы, такие как Rhino, 3Dstudiomax, но Лаборатией разработан небольшой простой алгоритм, делающий то же самое и получающий профили напрямую из 3D CAD программ.


5.2 Описание LE метода

1. Исходные данные - 3D модель параплана с профилями в тех местах, где они должны находиться.

2. Далее берем два соседних профиля, обозначаемых далеее профиль L (left) и профиль R (right).

3. Каждый профиль разделяем на две кривые (две 3D CAD полилинии), сответствующих верхней поверхности (между LE и TE) и нижней (между LE и TE). Воздухозаборники не входят в эти линии.

upper and lower surfaces
Рис 1: Верхняя и нижняя полилиния профиля

4. Берем полилинии от верхней панели между левым и правым профилем, каждый из которых состоит из равного количества N точек, где N достаточно большое число. Это точки из описания геометрии профиля. Можно запустить CAD комманду "_list " на полилинии, чтобы получить x, y, z координаты каждой из N точек. После чего копируем их в текстовый файл для последующей обработки нашей программой.

5. Основная идея заключается в том, что мы берем две соседние точки на левом профиле L1, L2 и на правом R1, R2, формирующих совместно параллелограмм. Теперь если мы разделим его диагональной линией, то получим два треугольника. Этот процесс называется триангуляцией. Мы можем найти стороны треугольников, потому что мы знаем координаты их вершин. Все что требуется, чтобы создать плоскую панель для любой изогнутой в пространстве поверхности, это поместить эти два треугольника на плоскость так, чтобы они соприкасались друг с другом своими "диагоналями" (сторонами, которые были раньше диагональю параллелограмма). Ошибка такого метода получения развертки минимальна, так как количество точек в профилях достаточно большое и каждый трегольник в отдельности является практически плоским.


R-L airfoils
Рис. 2:  Два соседний профиля и точки на них.

6. Дальше повторяем этот процесс для следующих точек: L2 и L3, R2 и R3, и так далее по всей поверхности. Результатом будет плоская поверхность, образованная треугольниками с совмещенными сторонами.

flat panel
Рис. 3: Плоская панель

7. Далее необходимо повторить процесс (4) для L и R полилиний для нижней поверхности.

8. И последнее, необходимо повторить начиная с пункта (2) для всех соседних профилей в половине крыла (так как вторая половина является симметричной, то ее можно не обрабатывать).



5.3 Аналитический геометрический принцип

Эта секция описывает реализацию пункта (5) из метода, описанного выше.

quadrilater
Рис. 4: Параллелограмм

Исходные данные:

L1, L2 - точки на кривой левого профиля
R1, R2 - точки на кривой правого профиля
a,b,c,d,e,f  - расстояния между точками

Неизвестные:

hR= высота треугольника L1-R1-R2
hL= высота треугольника L1-R1-L2
a1R, a2R
a1L, a2L

Основные зависимости:

[1]    hR2+a1R2 = b2
[2]    hR2+a2R2 = c2
[3]    a1R + a2R = a

вычитаем [1]-[2]:  

[4]    a1R2 - a2R2 = b2 - c2

заменяем [3] в предыдущем уравнении ( a1R = a - a2R ) и получаем a2R :

[5]    a2R = ( a2 -b2 + c2 ) / ( 2*a )   и
[6]    a1R = a - a2R     из [2]
[7]    hR = sqrt ( c2 - a2R2 )

аналогично для второго треугольника:

[8]     a2L = ( a2 -e2 + d2 ) / ( 2*a )   и
[9]     a1L = a - a2L     из [2]
[10]   hL = sqrt ( d2 - a2L2 )

В итоге мы имеем плоские координаты L1,L2,R1,R2 в системе координат, ортогональной L1-R1:

L1=(0,0)
R1=(a,0)
L2=(a1L,hL)
R2=(a1R,hR)

В XY координатной системе R1 лежит в точке (x0, y0), а линия L1-R1 повернута на θ градусов к оси X:

general
Рис. 5: Параллелограмм


L1x
L1y
=
X0
Y0

R1x
R1y
=
cos θ - sin θ
sin θ  cos θ
a
0
+
X0
Y0

L2x
L2y
=
cos θ - sin θ
sin θ  cos θ
a1L
hL
+
X0
Y0

R2x
R2y
=
cos θ - sin θ
sin θ  cos θ
a1R
hR
+
X0
Y0


Осталось перенести полученный параллелограмм в конец предыдущего, полученного на предыдущем шаге, чтобы совместить их в одну сплошную фигуру на плоскости:

X0    <-------   L2x
Y0    <-------   L2y
tan θ = ( R2y -  L2y ) / ( R2x  - L2x )

steep
Рис. 5: Перенос


5.4 FORTRAN программа

Программа считывает файлы примеров p1.txt и p2.txt (верхние панели 7-8 из проекта gnuLAB-1), и выводит результат расчета в файла panell.dxf.

c***************************************************************
c      PHC PARAGLIDING. PANEL SUBROUTINE.
c      Pere Hernàndez i Casellas
c      Laboratori d'envol
c      pere AT laboratoridenvol DOT com
c      Version 0.1 experimental 2005-02-13
c      Version 0.2 2006-09-01
c      Version 0.3 2009-01-10
c      FORTRAN g77 (GNU/Linux)
c***************************************************************

    program panell

    integer linecolor

    real rx(0:300),ry(0:300),rz(0:300)
    real sx(0:300),sy(0:300),sz(0:300)

    real x0,y0,theta

    real a,b,c,d,e,f

    real hr,a1r,a2r,hl,a1l,a2l

    real r1x(0:300),r1y(0:300),l1x(0:300),l1y(0:300)
    real r2x(0:300),r2y(0:300),l2x(0:300),l2y(0:300)

    area=0.

    open(unit=20,file='panel.dxf')
    open(unit=22,file='p1.txt')
    open(unit=23,file='p2.txt')

    rewind(22)
    rewind(23)

    pi=4.*atan(1.)

c   Read the left and right coordinates


    read (22,*)
    read (23,*)
    read (22,*) npunts
    read (23,*) npunts

    write (*,*) npunts

    do i=1,npunts

    read (22,*) x1,y1,z1
    read (23,*) x2,y2,z2

    rx(i)=x1
    ry(i)=y1
    rz(i)=z1
    sx(i)=x2
    sy(i)=y2
    sz(i)=z2

    write (*,*) rx(i),ry(i),rz(i)
    write (*,*) sx(i),sy(i),sz(i)

    end do

    x0=0.
    y0=0.
    theta=0.

    do i=1,npunts-1

c   Compute the basic lengths of the triangles

    a=sqrt((rx(i)-sx(i))*(rx(i)-sx(i))+(ry(i)-sy(i))*(ry(i)-sy(i))+(rz(i)-sz(i))*(rz(i)-sz(i)))
    b=sqrt((rx(i)-sx(i+1))*(rx(i)-sx(i+1))+(ry(i)-sy(i+1))*(ry(i)-sy(i+1))+(rz(i)-sz(i+1))*(rz(i)-sz(i+1)))
    c=sqrt((sx(i)-sx(i+1))*(sx(i)-sx(i+1))+(sy(i)-sy(i+1))*(sy(i)-sy(i+1))+(sz(i)-sz(i+1))*(sz(i)-sz(i+1)))
    d=sqrt((rx(i+1)-sx(i))*(rx(i+1)-sx(i))+(ry(i+1)-sy(i))*(ry(i+1)-sy(i))+(rz(i+1)-sz(i))*(rz(i+1)-sz(i)))
    e=sqrt((rx(i)-rx(i+1))*(rx(i)-rx(i+1))+(ry(i)-ry(i+1))*(ry(i)-ry(i+1))+(rz(i)-rz(i+1))*(rz(i)-rz(i+1)))
    f=sqrt((rx(i+1)-sx(i+1))*(rx(i+1)-sx(i+1))+(ry(i+1)-sy(i+1))*(ry(i+1)-sy(i+1))+(rz(i+1)-sz(i+1))*(rz(i+1)-sz(i+1)))

    write (*,*) a,f

    a2r=(a*a-b*b+c*c)/(2.*a)
    a1r=a-a2r
    hr=sqrt(c*c-a2r*a2r)

    a2l=(a*a-e*e+d*d)/(2.*a)
    a1l=a-a2l
    hl=sqrt(d*d-a2l*a2l)

    write(*,*) "a1,a2,a,a1+a2r", a1r,a2r,a,a1r+a2r
    write(*,*) "a1,a2,a,a1+a2l", a1l,a2l,a,a1l+a2l

    l1x(i)=x0
    l1y(i)=y0

    r1x(i)=a*cos(theta)+x0
    r1y(i)=a*sin(theta)+y0

    l2x(i)=a1l*cos(theta)-hl*sin(theta)+x0
    l2y(i)=a1l*sin(theta)+hl*cos(theta)+y0

    r2x(i)=a1r*cos(theta)-hr*sin(theta)+x0
    r2y(i)=a1r*sin(theta)+hr*cos(theta)+y0

    x0=l2x(i)
    y0=l2y(i)
    theta=atan((r2y(i)-l2y(i))/(r2x(i)-l2x(i)))

    write(*,*) "a1r,a2r,hr", a1r,a2r,hr
    write(*,*) "a1l,a2l,hl", a1l,a2l,hl

    write(*,*) x0,y0,theta

    end do

    do i=1,npunts-1

    write(*,*) l1x(i),l1y(i),l2x(i),l2y(i)

    call line(l1x(i),-l1y(i),r1x(i),-r1y(i),6)
    call line(l1x(i),-l1y(i),r2x(i),-r2y(i),5)
    call line(l1x(i),-l1y(i),l2x(i),-l2y(i),4)
    call line(r1x(i),-r1y(i),r2x(i),-r2y(i),3)
    call line(r1x(i),-r1y(i),l2x(i),-l2y(i),2)
    call line(l2x(i),-l2y(i),r2x(i),-r2y(i),3)

    end do
   
c   Close the output .dxf file

    write(20,'(A,/,I1,/,A)') "ENDSEC",0,"EOF"

c   Close units

    close (20)
    close (22)
    close (23)

    end

    SUBROUTINE line(p1x,p1y,p2x,p2y,linecolor)
c   line P1-P2
    integer linecolor
    write(20,'(A,/,I1,/,A)') "LINE",8,"default"
    write(20,'(I1,/,A)') 6,"CONTINUOUS"
    write(20,'(I2,/,F9.4,/,I2,/,F9.4)') 10,p1x,20,-p1y
    write(20,'(I2,/,F9.4,/,I2,/,F9.4)') 11,p2x,21,-p2y
    write(20,'(I2,/,I2,/,I2,/,I2,/,I2)') 39,0,62,linecolor,0

    return
    end