Тема: Помогите с "Алогоритмом художника"

Ответить в теме
Показано с 1 по 4 из 4
  1. Вверх #1
    Посетитель Аватар для road
    Пол
    Мужской
    Возраст
    42
    Сообщений
    386
    Репутация
    52

    Cool Помогите с "Алогоритмом художника"

    Имеется код в котором реализуется даный алгоритм, но теперь нужно в нем реализовать прозрачность... На рисунке ниже все видно.
    Задача:сделать пирамиду прозрачной, так чтобы была видна та фигура что на втором плане.

    Буду очень признателен за помощь.
    Есть формула прозрачности

    I=k*I1+(1-k)◦I2

    k-коэфициент прозрачности
    I1-интенсивность ближайшей плоскости
    I2-интенсивность дальней плоскости

    PHP код:
    //Подключение необходимых библиотек
    #include <math.h>
    #include <iostream.h>
    #include <conio.h>
    #include <graphics.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    #define NUMBERVERTEX 15 //Количество вершин
    #define NUMBERTRIANGLE 16 //Количество треугольников
     
     
    //Структура вершины
    struct Vertex {
     
        
    double x;
        
    double y;
        
    double z;
     
    }
        
    masVertex[NUMBERVERTEX]; //Массив вершин
     
    //Структура треугольника
    struct Triangle {
     
        
    int A;
        
    int B;
        
    int C;
     
    }
        
    masTriangle[NUMBERTRIANGLE]; //Массив треугольников
     
        
    double sortMasTriangle[NUMBERTRIANGLE]; //Массив для хранение значений отдаленности граней
     
    //Инициализация вершин
    void InitVertex () {
     
         
    masVertex[0].0;           masVertex[8].0;
         
    masVertex[0].0;           masVertex[8].6;
         
    masVertex[0].= -11;         masVertex[8].= -6;
     
         
    masVertex[1].20;          masVertex[9].6;
         
    masVertex[1].0;           masVertex[9].6;
         
    masVertex[1].= -8;          masVertex[9].= -6;
     
         
    masVertex[2].0;           masVertex[10].6;
         
    masVertex[2].0;           masVertex[10].6;
         
    masVertex[2].= -9;          masVertex[10].0;
     
         
    masVertex[3].0;           masVertex[11].0;
         
    masVertex[3].5;           masVertex[11].6;
         
    masVertex[3].= -9;          masVertex[11].0;
     
         
    masVertex[4].0;           masVertex[12].0;
         
    masVertex[4].0;           masVertex[12].0;
         
    masVertex[4].= -6;          masVertex[12].= -15;
     
         
    masVertex[5].6;           masVertex[13].15;
         
    masVertex[5].0;           masVertex[13].0;
         
    masVertex[5].= -6;          masVertex[13].0;
     
         
    masVertex[6].6;           masVertex[14].0;
         
    masVertex[6].0;           masVertex[14].15;
         
    masVertex[6].0;           masVertex[14].0;
     
         
    masVertex[7].0;
         
    masVertex[7].0;
         
    masVertex[7].0;
     
    }
     
    //Инициализация треуголиников
    void InitTriangle () {
     
       
    masTriangle[0].1;           masTriangle[8].8;
       
    masTriangle[0].3;           masTriangle[8].9;
       
    masTriangle[0].0;           masTriangle[8].10;
     
       
    masTriangle[1].1;           masTriangle[9].8;
       
    masTriangle[1].2;           masTriangle[9].10;
       
    masTriangle[1].3;           masTriangle[9].11;
     
       
    masTriangle[2].2;           masTriangle[10].6;
       
    masTriangle[2].0;           masTriangle[10].7;
       
    masTriangle[2].3;           masTriangle[10].10;
     
       
    masTriangle[3].0;           masTriangle[11].10;
       
    masTriangle[3].2;           masTriangle[11].7;
       
    masTriangle[3].1;           masTriangle[11].11;
     
       
    masTriangle[4].4;           masTriangle[12].7;
       
    masTriangle[4].5;           masTriangle[12].4;
       
    masTriangle[4].8;           masTriangle[12].8;
     
       
    masTriangle[5].8;           masTriangle[13].7;
       
    masTriangle[5].5;           masTriangle[13].8;
       
    masTriangle[5].9;           masTriangle[13].11;
     
       
    masTriangle[6].5;           masTriangle[14].6;
       
    masTriangle[6].6;           masTriangle[14].5;
       
    masTriangle[6].9;           masTriangle[14].4;
     
       
    masTriangle[7].9;           masTriangle[15].6;
       
    masTriangle[7].6;           masTriangle[15].4;
       
    masTriangle[7].10;          masTriangle[15].7;
     
    }
     
    //Отрисовка сцены
    void ShowObject (int COLORint Pattern) {
     
      
    int Sxmin 0
          
    Sxmax 639,
          
    Symin 0,
          
    Symax 479;
      
    double xmin = -9,
         
    xmax 9,
         
    ymin = -9,
         
    ymax 9;
     
         
    double mx = (Sxmax Sxmin)/(xmax xmin);
         
    double my = (Symax Symin)/(ymax ymin);
         
    double min;
         
    double X,Y,X1,Y1,X2,Y2;
     
         if (
    mx mymin my;
         else 
    min mx;
     
               
    //Задаем стиль отрисовки сцены
           
    setfillstyle(Pattern,COLOR);
           
    setcolor(MAGENTA);
           
    int Tria[6];
     
           
    //Отрисовка сцены
           
    for (int i=0i<NUMBERTRIANGLEi++) {
     
        
    masVertex[masTriangle[i].A].masVertex[masTriangle[i].A].z/sqrt(2);
        
    masVertex[masTriangle[i].A].masVertex[masTriangle[i].A].z/sqrt(2);
        
    Tria[0] = Sxmin min*(xmin);
        
    Tria[1] = Symax min*(ymin);
     
        
    X1 masVertex[masTriangle[i].B].masVertex[masTriangle[i].B].z/sqrt(2);
        
    Y1 masVertex[masTriangle[i].B].masVertex[masTriangle[i].B].z/sqrt(2);
        
    Tria[2] = Sxmin min*(X1 xmin);
        
    Tria[3] = Symax min*(Y1 ymin);
     
        
    X2 masVertex[masTriangle[i].C].masVertex[masTriangle[i].C].z/sqrt(2);
        
    Y2 masVertex[masTriangle[i].C].masVertex[masTriangle[i].C].z/sqrt(2);
        
    Tria[4] = Sxmin min*(X2 xmin);
        
    Tria[5] = Symax min*(Y2 ymin);
     
        
    fillpoly(3,Tria);
     
           }
     
    }
     
    //Сортировка граней по удаленности от камеры
    void SortTriangle () {
     
           
    //Нахождение средней величины Z - удаленности грани
           
    for (int i=0i<NUMBERTRIANGLEi++) {
     
         
    sortMasTriangle[i] = (masVertex[masTriangle[i].A].+
                       
    masVertex[masTriangle[i].B].+
                       
    masVertex[masTriangle[i].C].z)/3;
           }
     
        
    Triangle temp;
        
    int j;
        
    double TEMP;
     
      
    //Непосредственная сортировка граней по удаленности
      
    for (i=0i<NUMBERTRIANGLE-1i++)
     
        for (
    j=0j<NUMBERTRIANGLE-1j++)
     
        if (
    sortMasTriangle[j] <= sortMasTriangle[j+1]) {
     
         
    TEMP sortMasTriangle[j];
         
    sortMasTriangle[j] = sortMasTriangle[j+1];
         
    sortMasTriangle[j+1] = TEMP;
     
         
    temp masTriangle[j];
         
    masTriangle[j] = masTriangle[j+1];
         
    masTriangle[j+1] = temp;
     
        }
     
    }
     
    //Инициализация графики
    void InitGraph () {
      
    int gdriver DETECTgmodeerrorcode;
      
    initgraph(&gdriver, &gmode"");
    }
     
     
    int main () {
     
        
    InitGraph (); //Инициализация графики
        
    InitVertex ();//Инициализация вершин
        
    InitTriangle (); //Инициализация треугольников
        
    ShowObject (WHITE,9); //Отрисовка сцены
        
    SortTriangle (); //Сортировка граней по удаленности от камеры
        
    getch();
        
    ShowObject (WHITE,9); //Отрисовка сцены
     
          
    getch();
          return 
    0;
     

    ***


  2. Вверх #2
    Новичок
    Пол
    Мужской
    Сообщений
    23
    Репутация
    10
    А почему именно неточный, отсталый алгоритм художника, а не хороший, годный z-буфер? В условии задачи, как вы его привели, конкретный алгоритм не упоминается.

  3. Вверх #3
    Посетитель Аватар для road
    Пол
    Мужской
    Возраст
    42
    Сообщений
    386
    Репутация
    52
    Не, задача поставлена именно Алгоритмом художника...
    ***

  4. Вверх #4
    Новичок
    Пол
    Мужской
    Сообщений
    23
    Репутация
    10
    Ну тогда вам придется написать свою filltriangle(), в которой вместо putpixel(x, y, color) будет putpixel(x, y, k * color + (1 - k) * getpixel(x, y)).

Ответить в теме

Похожие темы

  1. 22 июля: Synth Gothic Party "Note From a Decadence"
    от Dimiz в разделе Музыка
    Ответов: 17
    Последнее сообщение: 05.04.2020, 20:20
  2. 06.05.2005 Gothic-party "Серый сон", концерт "
    от Оборотень в разделе Музыка
    Ответов: 4
    Последнее сообщение: 15.03.2014, 10:48
  3. Кто-нибудь сталкивался с фирмой "Портал" (ЧП "
    от OTM в разделе Основной форум
    Ответов: 2
    Последнее сообщение: 08.04.2004, 08:37

Метки этой темы

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения