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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.11.2012, 11:43   #11
Murashov
Форумчанин
 
Аватар для Murashov
 
Регистрация: 30.10.2012
Сообщений: 121
По умолчанию

да, я уже думал об этом.. в сотни раз быстрее будет работать, если делать такую проверку.. но как?
Murashov вне форума Ответить с цитированием
Старый 01.11.2012, 11:54   #12
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Условие попадания точки (x,y) в круг с центром (x0, y0) и радиусом R вроде общеизвестно, нет?
(x-x0)*(x-x0)+(y-y0)*(y-y0) <= R*R
Abstraction вне форума Ответить с цитированием
Старый 01.11.2012, 13:46   #13
Murashov
Форумчанин
 
Аватар для Murashov
 
Регистрация: 30.10.2012
Сообщений: 121
По умолчанию

Цитата:
Сообщение от Abstraction Посмотреть сообщение
Условие попадания точки (x,y) в круг с центром (x0, y0) и радиусом R вроде общеизвестно, нет?
(x-x0)*(x-x0)+(y-y0)*(y-y0) <= R*R
поточнее можно?
Murashov вне форума Ответить с цитированием
Старый 01.11.2012, 14:36   #14
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

???
Куда точнее? Пусть x0, y0 - центр нашей окружности; R - её радиус. Проходим двойным циклом по всем точкам от (x0-R, y0-R) до (x0+R, y0+R) и для каждой точки (x,y) проводим вышеуказанную проверку. Это же азы аналитической геометрии.
Abstraction вне форума Ответить с цитированием
Старый 01.11.2012, 20:44   #15
Murashov
Форумчанин
 
Аватар для Murashov
 
Регистрация: 30.10.2012
Сообщений: 121
По умолчанию

Посмотрите пожалуйста код. почему-то вычитание (функция circleTask3) не работает как нужно. круг должен получаться что-то вроде пакмена, а прога его тупо обрезает и делает породистого пакмена(
пересечение и объединение вроде работает, а вот вычитание увы...

Код:
#include <stdio.h>
#include <stdlib.h>
#include <SDL2/SDL.h>

int checkPoint(int x, int y, int x0, int y0, int r)//x y точка, x0 y0 центр, r радиус
{
    if((x-x0)*(x-x0)+(y-y0)*(y-y0)<=r*r) return 1;
    else return 0;
}

void circleTask1(SDL_Renderer *tmp,int x,int y,int radius, int x2,int y2, int radius2)
{
    int i;
        for(i=1 ; i<= 2*M_PI*pow(radius,2) ; i++)
        {
            if(checkPoint(x, y, x2-cos(i)*radius, y2+sin(i)*radius, radius))
                SDL_RenderDrawPoint( tmp , x2-cos(i)*radius , y2+sin(i)*radius );
            if(checkPoint(x2, y2, x-cos(i)*radius, y+sin(i)*radius, radius))
                SDL_RenderDrawPoint( tmp , x-cos(i)*radius , y+sin(i)*radius );
        }
}

void circleTask2(SDL_Renderer *tmp,int x,int y,int radius, int x2,int y2, int radius2)
{
    int i;
        for(i=1 ; i<= 2*M_PI*pow(radius,2) ; i++)
        {
            if(!checkPoint(x, y, x2-cos(i)*radius, y2+sin(i)*radius, radius))
                SDL_RenderDrawPoint( tmp , x2-cos(i)*radius , y2+sin(i)*radius );
            if(!checkPoint(x2, y2, x-cos(i)*radius, y+sin(i)*radius, radius))
                SDL_RenderDrawPoint( tmp , x-cos(i)*radius , y+sin(i)*radius );
        }
}

void circleTask3(SDL_Renderer *tmp,int x,int y,int radius, int x2,int y2, int radius2)
{
    int i;
        for(i=1 ; i<= 2*M_PI*pow(radius,2) ; i++)
        {
            //if(checkPoint(x, y, x2-cos(i)*radius, y2+sin(i)*radius, radius))
                //SDL_RenderDrawPoint( tmp , x2-cos(i)*radius , y2+sin(i)*radius );
                //если рисуемая точка первого круга входит во второй, то не рисовать её
            if(!checkPoint(x-cos(i)*radius, y+sin(i)*radius, x2, y2, radius))
                SDL_RenderDrawPoint( tmp , x-cos(i)*radius , y+sin(i)*radius );
        }
}
void setRect(SDL_Renderer *tmp,int x,int y,int width,int height)
{
    int i,j;
    for(i=y; i<height+y; i++)
    {
        for(j=x; j<width+x; j++)
            SDL_RenderDrawPoint(tmp,j,i);
    }


}

int main(int argc,char **argv)
{
    SDL_Window *wnd;
    SDL_Renderer *render;
    int i;

    if(SDL_Init(SDL_INIT_VIDEO)<0)printf("error");

    wnd=SDL_CreateWindow("Lab1",SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED,800,600,SDL_WINDOW_SHOWN);
    render=SDL_CreateRenderer(wnd,-1,1);


    SDL_SetRenderDrawColor(render,200,112,200,0);

    //первое задание:
    int radius=95;
    for(i=0;i<=radius;i++)
        circleTask1(render,200,100,i, 350,100,i);
    for(i=0;i<=radius;i++)
        circleTask2(render,200,300,i, 350,300,i);
    for(i=0;i<=radius;i++)
        circleTask3(render,200,500,i, 350,500,i); //две окружности. координаты x, y, радиус, координаты x, y, радиус
    //checkPoint(0, 0, 200, 200, 150);//x y точка, x0 y0 центр, r радиус

    //setRect(render,400,400,200,150);
    SDL_RenderPresent(render);
    SDL_Delay(100000);

    SDL_Quit();
    return 0;
}

Последний раз редактировалось Murashov; 01.11.2012 в 20:47.
Murashov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Окружность Ins1De Общие вопросы C/C++ 2 29.11.2011 12:15
окружность кольца tcjkjl Помощь студентам 3 05.11.2011 10:36
окружность MetR Помощь студентам 1 08.01.2011 13:05
Пунктирная окружность Гамбит Помощь студентам 3 13.03.2010 14:39
Окружность.. surovii Помощь студентам 28 29.03.2009 18:00