Построение каркасного изображения тел в ортогональной и центральной проекциях
Изображение объектов на картинной плоскости. Проектирования при помощи пучка прямых. Параллельное и центральное виды проектирования. Расположение координатных осей. Построение центральных проекций. Прорисовка изображения на компоненте "Timage".
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 23.04.2014 |
Размер файла | 64,5 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
1. Формулировка задания курсового проекта
Построение каркасного изображения тел в ортогональной и центральной проекциях.
Предусмотреть построение каркасных изображений различных трехмерных геометрических тел в параллельной и центральной проекциях с возможностью изменения точек наблюдения.
2. Теоретическое описание решения поставленной задачи
2.1 Виды проектирования
Изображение объектов на картинной плоскости связанно с геометрической операцией - проектирования при помощи пучка прямых. В компьютерной графике используется несколько различных видов проектирования. Наиболее употребимые на практике виды проектирования параллельное и центральное.
Размещено на http://www.allbest.ru/
Для получения проекции объекта на картинную плоскость необходимо провести через каждую его точку прямую из заданного проектирующего пучка и затем найти координаты точки пересечения этой прямой с плоскостью изображения. В случае центрального проектирования все прямые исходят из одной точки - центра собственного пучка. При параллельном проектировании центр пучка считается лежащим в бесконечности.
Каждый из этих двух основных классов разбивается на несколько подклассов в зависимости от взаимного расположения картинной плоскости и координатных осей.
изображение плоскость проекция параллельный
При ортографической проекции картинная плоскость совпадает с одной из координатных плоскостей или параллельна ей.
При аксонометрической проекции, прямые перпендикулярны картинной плоскости.
В соответствии со взаимным расположением плоскости проектирования координатных осей различают три вида проекций:
Триметрию- нормальный вектор картинной плоскости образует с ортами координатных осей попарно различные углы;
Диметрию- два угла между нормалью картинной плоскости и координатными осями равны ;
Изометрию- все три угла между нормалью картинной плоскости и координатными осями равны ;
Каждый из трех видов проекции получается комбинацией поворотов, за которой следует параллельное проектирование.
Размещено на http://www.allbest.ru/
Центральные проекции строятся более сложно.
Предположим, что центр проектирования лежит на оси Oz в точке С(0, 0, с) и плоскость проектирования совпадает с координатной плоскостью ХУ. Берем в пространстве произвольную точку M(x, y, z) проведем через нее и точку С прямую и получим соответствующие уравнения:
X*= xt,
Y*= yt,
Z*= c+(z-c)t;
Найдем координаты точки пересечения построенной прямой с плоскостью ХУ.
Из условия Z*=0 получаем, что
Программа реализована при помощи Borland C++ Builder 5.0.
Прорисовка изображения осуществляется на компоненте Timage.
В программе определенны следующие не стандартные функции:
void __fastcall DefCube(void);
void __fastcall DefTetr(void);
void __fastcall DefOct(void);
void __fastcall RexDraw(bool fl);
void __fastcall RexRotOX(bool fl);
void __fastcall RexRotOY(bool fl);
void __fastcall RexRotOZ(bool fl);
void __fastcall RexProection(bool fl);
Функции DefCube(void), void __fastcall DefTetr(void),
void __fastcall DefOct(void) заносят точки фигур - куба, тераэдера и октаэдера в массив структур
struct Matrix3D{float x, y, z;}
Функции void __fastcall RexRotOX(bool fl), void __fastcall RexRotOY(bool fl), void __fastcall RexRotOZ(bool fl) осуществляют вращение точек вокруг соответствующих осей по формулам:
вращение вокруг оси абцисс Ох
x*=x;
y*=y cos - z sin;
z*=y sin + z cos;
вращение вокруг оси ординат Оу
x*=x cos + z sin;
y*=y;
z*=x sin + z cos;
вращение вокруг оси аппликат Oz
x*=x cos - y sin;
y*=x sin + y cos;
z*=z;
переменная логического типа fl определяет поворот по часовой или против часовой стрелке будет происходить поворот.
Функция void __fastcall RexProection(bool fl) осуществляет проектирование точек трехмерного пространства на картинную плоскость. При этом точки переносятся в массив структур
Struct Matrix2D{float x, y;} точки картинной плоскости.
Параметр bool fl определяет тип проекции - центральная или паралельная.
Функция void __fastcall RexDraw(bool fl) производит прорисовку изображения на компоненте TImage при этом точки для прорисовки берутся из массива matr2d.
На второй форме приложения осуществляется выбор фигуры и вида проектирования.
Текст программы
//---------------------------------------------------------------------------
Текст программы Формы 1.
#include <vcl.h>
#include <math.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
struct Matrix3D
{
float x, y,z;
} matr3d[8];
struct Matrix2D
{
float x, y;
} matr2d[8];
float a[24], b[16];
float ks=cos(45*3.14/180);
float ksin=sin(40*3.14/3.14), kcos=cos(40*3.14/180);
int krot=1;
int midx, midy,l=500,r=60;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
midx=Image1->Width/2;
midy=Image1->Height/2;
Image1->Canvas->Brush->Color=clBlack;
Image1->Canvas->FillRect(Rect(0,0,midx*2,midy*2));
Image1->Canvas->Pen->Color=clBlue;
Image1->Canvas->Pen->Width=10;
DefCube();
RexProection(false);
RexDraw(false);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RexDraw(bool fl)
{int i;
if(!fl)
{
Image1->Canvas->FillRect(Rect(0,0,midx*2,midy*2));
Image1->Canvas->MoveTo(matr2d[3].x, matr2d[3].y);
for(i=0;i<=7;i++)
Image1->Canvas->LineTo(matr2d[i].x, matr2d[i].y);
Image1->Canvas->LineTo(matr2d[4].x, matr2d[4].y);
Image1->Canvas->MoveTo(matr2d[0].x, matr2d[0].y);
Image1->Canvas->LineTo(matr2d[5].x, matr2d[5].y);
Image1->Canvas->MoveTo(matr2d[1].x, matr2d[1].y);
Image1->Canvas->LineTo(matr2d[6].x, matr2d[6].y);
Image1->Canvas->MoveTo(matr2d[2].x, matr2d[2].y);
Image1->Canvas->LineTo(matr2d[7].x, matr2d[7].y);
}
else
{
if(Form2->RadioButton1->Checked)
{
Image1->Canvas->FillRect(Rect(0,0,midx*2,midy*2));
Image1->Canvas->MoveTo(matr2d[3].x, matr2d[3].y);
for(i=0;i<=7;i++)
Image1->Canvas->LineTo(matr2d[i].x, matr2d[i].y);
Image1->Canvas->LineTo(matr2d[4].x, matr2d[4].y);
Image1->Canvas->MoveTo(matr2d[0].x, matr2d[0].y);
Image1->Canvas->LineTo(matr2d[5].x, matr2d[5].y);
Image1->Canvas->MoveTo(matr2d[1].x, matr2d[1].y);
Image1->Canvas->LineTo(matr2d[6].x, matr2d[6].y);
Image1->Canvas->MoveTo(matr2d[2].x, matr2d[2].y);
Image1->Canvas->LineTo(matr2d[7].x, matr2d[7].y);
}
if(Form2->RadioButton2->Checked)
{
Image1->Canvas->FillRect(Rect(0,0,midx*2,midy*2));
Image1->Canvas->MoveTo(matr2d[3].x, matr2d[3].y);
for(i=0;i<=3;i++)
Image1->Canvas->LineTo(matr2d[i].x, matr2d[i].y);
Image1->Canvas->LineTo(matr2d[4].x, matr2d[4].y);
Image1->Canvas->MoveTo(matr2d[0].x, matr2d[0].y);
Image1->Canvas->LineTo(matr2d[4].x, matr2d[4].y);
Image1->Canvas->MoveTo(matr2d[1].x, matr2d[1].y);
Image1->Canvas->LineTo(matr2d[4].x, matr2d[4].y);
Image1->Canvas->MoveTo(matr2d[2].x, matr2d[2].y);
Image1->Canvas->LineTo(matr2d[4].x, matr2d[4].y);
}
if(Form2->RadioButton3->Checked)
{
Image1->Canvas->FillRect(Rect(0,0,midx*2,midy*2));
Image1->Canvas->MoveTo(matr2d[3].x, matr2d[3].y);
for(i=0;i<=3;i++)
Image1->Canvas->LineTo(matr2d[i].x, matr2d[i].y);
Image1->Canvas->LineTo(matr2d[4].x, matr2d[4].y);
Image1->Canvas->MoveTo(matr2d[0].x, matr2d[0].y);
Image1->Canvas->LineTo(matr2d[4].x, matr2d[4].y);
Image1->Canvas->MoveTo(matr2d[1].x, matr2d[1].y);
Image1->Canvas->LineTo(matr2d[4].x, matr2d[4].y);
Image1->Canvas->MoveTo(matr2d[2].x, matr2d[2].y);
Image1->Canvas->LineTo(matr2d[4].x, matr2d[4].y);
Image1->Canvas->MoveTo(matr2d[3].x, matr2d[3].y);
Image1->Canvas->LineTo(matr2d[5].x, matr2d[5].y);
Image1->Canvas->MoveTo(matr2d[0].x, matr2d[0].y);
Image1->Canvas->LineTo(matr2d[5].x, matr2d[5].y);
Image1->Canvas->MoveTo(matr2d[1].x, matr2d[1].y);
Image1->Canvas->LineTo(matr2d[5].x, matr2d[5].y);
Image1->Canvas->MoveTo(matr2d[2].x, matr2d[2].y);
Image1->Canvas->LineTo(matr2d[5].x, matr2d[5].y);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RexRotOX(bool fl)
{int i,f;
float z,y;
if(fl) f=1;
else f=-1;
for(i=0;i<=7;i++)
{
z=matr3d[i].z;
y=matr3d[i].y;
matr3d[i].y=y*cos(krot*f*3.14/180)-z*sin(krot*f*3.14/180);
matr3d[i].z=y*sin(krot*f*3.14/180)+z*cos(krot*f*3.14/180);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RexRotOY(bool fl)
{int i,f;
float x,z;
if(fl) f=1;
else f=-1;
for(i=0;i<=7;i++)
{
x=matr3d[i].x;
z=matr3d[i].z;
matr3d[i].x=x*cos(krot*f*3.14/180)+z*sin(krot*f*3.14/180);
matr3d[i].z=-x*sin(krot*f*3.14/180)+z*cos(krot*f*3.14/180);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RexRotOZ(bool fl)
{int i,f;
float x,y;
if(fl) f=1;
else f=-1;
for(i=0;i<=7;i++)
{
x=matr3d[i].x;
y=matr3d[i].y;
matr3d[i].x=x*cos(krot*f*3.14/180)-y*sin(krot*f*3.14/180);
matr3d[i].y=x*sin(krot*f*3.14/180)+y*cos(krot*f*3.14/180);
}
}
void __fastcall TForm1::SpeedButton1Click(TObject *Sender)
{
RexRotOZ(true);
RexProection(true);
RexDraw(true);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton2Click(TObject *Sender)
{
RexRotOZ(false);
RexProection(true);
RexDraw(true);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::RexProection(bool fl)
{int i;
float x, y, z;
for(i=0;i<=7;i++)
{ if(!fl)
{
matr2d[i].x=matr3d[i].x*kcos-matr3d[i].y*kcos+midx;
matr2d[i].y=matr3d[i].z-matr3d[i].y*ksin-matr3d[i].x*ksin+midy;
}
else
{
if(Form2->RadioButton4->Checked)
{x=matr3d[i].x;
y=matr3d[i].y;
z=matr3d[i].z;
matr2d[i].x=x*kcos-y*kcos+midx;
matr2d[i].y=z-y*ksin-x*ksin+midy;
}
if(Form2->RadioButton5->Checked)
{
x=matr3d[i].x;
y=matr3d[i].y;
z=matr3d[i].z;
x=(r+l)*x/(l+y);
z=(r+l)*z/(l+y);
matr2d[i].x=x-y*ks+midx;
matr2d[i].y=z-y*ks+midy;
}
}
}
}
void __fastcall TForm1::SpeedButton3Click(TObject *Sender)
{
RexRotOX(true);
RexProection(true);
RexDraw(true);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton4Click(TObject *Sender)
{
RexRotOX(false);
RexProection(true);
RexDraw(true);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton5Click(TObject *Sender)
{
RexRotOY(true);
RexProection(true);
RexDraw(true);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton6Click(TObject *Sender)
{
RexRotOY(false);
RexProection(true);
RexDraw(true);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton7Click(TObject *Sender)
{
if(Form2->ShowModal())
{
if(Form2->RadioButton1->Checked) DefCube();
if(Form2->RadioButton2->Checked) DefTetr();
if(Form2->RadioButton3->Checked) DefOct();
Image1->Canvas->Pen->Color=Form2->Panel6->Color;
Image1->Canvas->Brush->Color=Form2->Panel7->Color;
krot=Form2->TrackBar1->Position;
l=Form2->TrackBar3->Position;
RexDraw(true);
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton9Click(TObject *Sender)
{
Timer1->Enabled=true;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SpeedButton8Click(TObject *Sender)
{
Timer1->Enabled=false;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
RexRotOZ(true);
RexProection(true);
RexDraw(true);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DefCube(void)
{
matr3d[0].x=40; matr3d[0].y=40; matr3d[0].z=40;
matr3d[1].x=-40;matr3d[1].y=40; matr3d[1].z=40;
matr3d[2].x=-40;matr3d[2].y=-40;matr3d[2].z=40;
matr3d[3].x=40; matr3d[3].y=-40;matr3d[3].z=40;
matr3d[4].x=40; matr3d[4].y=-40;matr3d[4].z=-40;
matr3d[5].x=40; matr3d[5].y=40; matr3d[5].z=-40;
matr3d[6].x=-40;matr3d[6].y=40; matr3d[6].z=-40;
matr3d[7].x=-40;matr3d[7].y=-40;matr3d[7].z=-40;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DefTetr(void)
{
matr3d[0].x=40; matr3d[0].y=40; matr3d[0].z=40;
matr3d[1].x=-40;matr3d[1].y=40; matr3d[1].z=40;
matr3d[2].x=-40;matr3d[2].y=-40;matr3d[2].z=40;
matr3d[3].x=40; matr3d[3].y=-40;matr3d[3].z=40;
matr3d[4].x=0; matr3d[4].y=0;matr3d[4].z=-40;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::DefOct(void)
{
matr3d[0].x=40; matr3d[0].y=40; matr3d[0].z=0;
matr3d[1].x=-40;matr3d[1].y=40; matr3d[1].z=0;
matr3d[2].x=-40;matr3d[2].y=-40;matr3d[2].z=0;
matr3d[3].x=40; matr3d[3].y=-40;matr3d[3].z=0;
matr3d[4].x=0; matr3d[4].y=0;matr3d[4].z=-90;
matr3d[5].x=0; matr3d[5].y=0;matr3d[5].z=90;
}
Текст программы Формы 2.
/---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit2.h"
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::FormCreate(TObject *Sender)
{ Panel6->Color=Form1->Image1->Canvas->Pen->Color;
Panel7->Color=Form1->Image1->Canvas->Brush->Color;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Panel6Click(TObject *Sender)
{ if(ColorDialog1->Execute()) Panel6->Color=ColorDialog1->Color;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Panel7Click(TObject *Sender)
{
if(ColorDialog1->Execute()) Panel7->Color=ColorDialog1->Color;
}
//---------------------------------------------------------------------------
void __fastcall TForm2::TrackBar1Change(TObject *Sender)
{ Label1->Caption="Ротация на "+IntToStr(TrackBar1->Position)+" градус.";
}
//---------------------------------------------------------------------------
void __fastcall TForm2::TrackBar2Change(TObject *Sender)
{ Form1->Image1->Canvas->Pen->Width=TrackBar2->Position;
}
Размещено на Allbest.ru
...Подобные документы
Яркость точек и гистограммы изображения. Изменение яркости и контрастности. Метод ранговой фильтрации с оценкой середины диапазона. Наложение шумов на изображение. Преобразование изображения в негатив. Получение матрицы яркостей и построение гистограмм.
курсовая работа [1,5 M], добавлен 11.12.2012Векторная графика как способ описания изображения при помощи прямых и изогнутых линий. Пример растрового и векторного представления листа с дерева. Редакторы векторной графики. Особенности растрового изображения. Методы сжатия с потерями и без потерь.
реферат [2,1 M], добавлен 28.09.2014Информация о графических форматах. Хранение изображения в программе. Очередь как вспомогательная структура данных. Загрузка изображения из двоичного файла. Операции с изображением. Уменьшение разрешающей способности. Увеличение размера изображения.
курсовая работа [1,1 M], добавлен 29.06.2013Методика устранения посторонних шумов и коррекции искажения типа дисфокусировки. Обрезка сильно искаженных краев изображения. Построение яркостной гистограммы изображения и его преобразование в индексный формат с восьмицветовой палитрой в пакете Matlab.
контрольная работа [4,7 M], добавлен 13.01.2012Особенности и основные этапы создания изображения с тремя движущимися объектами при помощи графического режима Graph в Паскале. Разработка программы с текстом не меньше четырехсот строк. Использование динамической памяти при создании движения изображения.
отчет по практике [564,7 K], добавлен 14.06.2014Интерфейс программы Adobe Photoshop. Внесение изменений в изображение. Инструменты изменения оттенка и искажения изображения. Последовательность формирования изображения. Тоновая и цветовая коррекция изображения, работа с фильтрами и функциями.
курсовая работа [2,8 M], добавлен 14.12.2011Обзор алгоритмов распознания объектов на двумерных изображениях. Выбор языка программирования. Обнаружение устойчивых признаков изображения. Исследование алгоритмов поиска объектов на плоскости. Модификация алгоритма поиска максимума дискретной функции.
дипломная работа [1,0 M], добавлен 16.06.2013Описание сборочной единицы шарикоподшипника радиального однорядного. Расчет зубчатого колеса. Построение сборочного чертежа. Построение изображения деталей с помощью AutoLISP. Проектирование 3D-модели цилиндра с монтажными отверстиями в AutoCAD.
курсовая работа [2,8 M], добавлен 27.03.2011Разработка программы, предназначенной для сжатия или компрессии полутонового изображения международным стандартом JPEG. Описание метода JPEG, выдача результатов в виде декодированного изображения. Обзор методов компрессии полутонового изображения.
курсовая работа [43,5 K], добавлен 14.10.2012Разработка чертежа сборочной единицы в компьютерной системе автоматизированного проектирования AutoCAD. Описание сборочной единицы. Проектирование зубчатого колеса. Построение изображения деталей с помощью AutoLISP. Построение 3D-модели в AutoCAD.
курсовая работа [443,2 K], добавлен 27.03.2011Описание алгоритма поворота изображения. Вычисление синуса и косинуса угла поворота изображения. Алгоритм и реализация функции поворота изображения вокруг центра на заданный пользователем угол. Проверка на соответствие диапазону допустимых значений.
курсовая работа [1,3 M], добавлен 23.01.2015Разработка приложения, целью которого ставится преобразование черно-белых полутоновых изображений в цветные. Обзор методики обработки изображения, способов преобразования изображения с помощью нейронной сети. Описания кластеризации цветового пространства.
дипломная работа [6,3 M], добавлен 17.06.2012Описание этапов создания анимированного GIF изображения мультипликационного героя "Винни-Пуха" в программе Adobe Photoshop CS6. Создание дубликата слоя изображения и подготовка кадров для GIF анимации. Настройка эффектов анимации и результат GIF-файла.
лабораторная работа [1,2 M], добавлен 05.03.2015Общие сведения о языке программирования Matlab. Функции работы с векторами и матрицами. Операторы условных переходов. Построение двумерных графиков. Построение гистограммы изображения. Функции его преобразования и зашумления, метрики определения качества.
лабораторная работа [853,5 K], добавлен 25.10.2015Сущность обратного проектирования, принцип работы лазерных сканеров. Этапы обратного проектирования модели существующего объекта. Построение модели по фотографиям, обработка полигональной сетки и построение параметрических поверхностей в Geomagic Wrap.
курсовая работа [4,8 M], добавлен 19.11.2017Компьютерная графика. Пиксели, разрешение, размер изображения. Типы изображений. Черно-белые штриховые и полутоновые изображения. Индексированные цвета. Полноцветные изображения. Форматы файлов. Цвет и его модели. Цветовые модели: RGB, CMYK, HSB.
реферат [18,1 K], добавлен 20.02.2009Методы кодирования изображения: кодированием длины серии, частотно-зависимое кодирование, метод Лемпеля-Зива. Размер строки при 16-битном цвете. Расчет размера всего исходного изображения. Примеры качественного и некачественного сжатия изображения.
презентация [2,0 M], добавлен 22.10.2013Растровая графика, составление графических изображений из отдельных точек (пикселей). Растровые графические редакторы. Векторная графика - построение изображения из простых объектов. Достоинства, недостатки и применение растровой и векторной графики.
презентация [7,8 K], добавлен 06.01.2014Алгоритмы построения изображений, близких к фотореалистичным. Трассировка лучей и построение теней. Схема расчета интенсивности света. Параметры, задающие свойства тел. Зависимость времени построения от глубины рекурсии и количества источников освещения.
курсовая работа [734,3 K], добавлен 18.06.2009Процесс выделения некоторой части изображения при помощи компьютерной графики. Применение отсечения для устранения ступенчатости. Алгоритмы удаления невидимых линий и поверхностей. Построение теней и формирование фактуры. Способы двумерного отсечения.
презентация [145,7 K], добавлен 14.08.2013