Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.12.2012, 19:35   #1
Brutale
Новичок
Джуниор
 
Регистрация: 23.12.2012
Сообщений: 2
По умолчанию Проверьте алгоритмы(рисования) на работоспособность(С, С++, Obj. Pascal)

Алгоритм Брезенхема для рисования прямой
Код:
X= x1;
Y= y1;
Px= x2 - x1;
Py= y2 - y1;
E= 2*Py - Px;
i= Px;
PutPixel(X, Y); 
while (i= i- 1 і 0) {
if (E і 0) {
X= X + 1;
Y= Y + 1;
E= E + 2*(Py - Px);
} else
X= X + 1;
E= E + 2*Py;
PutPixel(X, Y); 
}
Алгоритм Брезенхэма для рисования окружностей для С++
Код:
void drawCircle(int x0, int y0, int radius) {
        int x = 0;
        int y = radius;
        int delta = 2 - 2 * radius;
        int error = 0;
        while(y >= 0) {
                setPixel(x0 + x, y0 + y);
                setPixel(x0 + x, y0 - y);
                setPixel(x0 - x, y0 + y);
                setPixel(x0 - x, y0 - y);
                error = 2 * (delta + y) - 1;
                if(delta < 0 && error <= 0) {
                        ++x;
                        delta += 2 * x + 1;
                        continue;
                }
                error = 2 * (delta - x) - 1;
                if(delta > 0 && error > 0) {
                        --y;
                        delta += 1 - 2 * y;
                        continue;
                }
                ++x;
                delta += 2 * (x - y);
                --y;
        }
}
Рисование Линий на Object Pascal
Код:
Procedure Swap(var x,y:Integer);
    var t:Integer;
    begin
      t:=x;x:=y;y:=t;
    end;
 
    Procedure Line(Canvas: TCanvas; x1,y1,x2,y2:integer);
    var dx,dy,i,sx,sy,check,e,x,y:integer;
    begin
        dx:=abs(x1-x2);
        dy:=abs(y1-y2);
        sx:=Sign(x2-x1);
        sy:=Sign(y2-y1);
        x:=x1;
        y:=y1;
        check:=0;
        if dy>dx then begin
            Swap(dx,dy);
            check:=1;
        end;
        e:= 2*dy - dx;
        for i:=0 to dx do begin
            Canvas.Pixels[x,y]:=clBlack;
            if e>=0 then begin
                if check=1 then inc(x,sx) else inc(y,sy);
                dec(e,2*dx);
            end;
            if check=1 then inc(y,sy) else inc(x,sx);
            inc(e,2*dy);
        end;
    end;
Алгоритм Коэна — Сазерленда на языке С
Код:
#define LEFT  1  
#define RIGHT 2  
#define BOT   4  
#define TOP   8  
 
struct point {
        double x, y;
};
 
struct rect {
        double x_min, y_min, x_max, y_max;
};
 
#define vcode(r, p) \
        ((((p)->x < (r)->x_min) ? LEFT : 0)  +  /* +1 если точка левее прямоугольника */ \
         (((p)->x > (r)->x_max) ? RIGHT : 0) +  /* +2 если точка правее прямоугольника */\
         (((p)->y < (r)->y_min) ? BOT : 0)   +  /* +4 если точка ниже прямоугольника */  \
         (((p)->y > (r)->y_max) ? TOP : 0))     /* +8 если точка выше прямоугольника */
 
int cohen_sutherland (const struct rect *r, struct point *a, struct point *b)
{
        int code_a, code_b, code; 
        struct point *c;
 
        code_a = vcode(r, a);
        code_b = vcode(r, b);
 
        while (code_a | code_b) {
                if (code_a & code_b)
                        return -1;
                if (code_a) {
                        code = code_a;
                        c = a;
                } else {
                        code = code_b;
                        c = b;
                }
 
                if (code & LEFT) {
                        c->y += (a->y - b->y) * (r->x_min - c->x) / (a->x - b->x);
                        c->x = r->x_min;
                } else if (code & RIGHT) {
                        c->y += (a->y - b->y) * (r->x_max - c->x) / (a->x - b->x);
                        c->x = r->x_max;
                }
                else if (code & BOT) {
                        c->x += (a->x - b->x) * (r->y_min - c->y) / (a->y - b->y);
                        c->y = r->y_min;
                } else if (code & TOP) {
                        c->x += (a->x - b->x) * (r->y_max - c->y) / (a->y - b->y);
                        c->y = r->y_max;
                }
                 if (code == code_a)
                        code_a = vcode(r,a);
                else
                        code_b = vcode(r,b);
        }
 
        return 0;
}
Алгоритм ЦДА
Код:
procedure lineBres(x1,y1, x2, y2 : integer);
var
x, y,xend, yend, dx, dy : integer;
k, xf, yf : float; {тип float - один из вещественныхтипов}
begin
dx := abs(x2-x1); dy := abs(y2-y1);
if dx > dy then begin {почти горизонтальна}
k := (y2 - y1)/(x2 - x1);
if x1 < x2 then begin
yf := y1; x := x1; xend := x2;
end
else begin
x := x2; xend := x1; yf := y2;
end;
repeat
putpixel(x, round(yf),cc){ставим точку цветом СС}
inc(x); inc(yf, k);
until x > xend;
end
else if dy = 0 then putpixel(x1, y1, cc)
else ... { аналогично}
Заранее благодарен!
Brutale вне форума Ответить с цитированием
Старый 23.12.2012, 20:50   #2
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,899
По умолчанию

Рисование линий в обж.паскале - абсолютная копия с википедии, что его проверять ? Остальные небось тоже нагуглены ?
phomm вне форума Ответить с цитированием
Старый 23.12.2012, 21:03   #3
Brutale
Новичок
Джуниор
 
Регистрация: 23.12.2012
Сообщений: 2
По умолчанию

Верно. Намек понял)
Brutale вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Obj Pascal, ошибки Gleizer Помощь студентам 2 23.12.2012 01:18
задача на разветвленные алгоритмы (turbo pascal) Mr.KOHCEPBATOP Помощь студентам 2 02.10.2011 10:56
перевести программу рисования графиков с Pascal на Delphi DooD Помощь студентам 5 19.05.2011 23:15
проверьте пожалуйста программы в Pascal. bear12345 Помощь студентам 1 29.03.2009 13:59