Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Описать тип struct Rectangle

81K
05 июня 2017 года
ross_
12 / / 14.03.2017
Описать тип struct Rectangle, задающий на плоскости замкнутый прямоугольник со сторонами, параллельными координатным осям и габаритами (x–, x+) и (y–, y+) по осям абсцисс и ординат соответственно. Реализовать в виде отдельных функций следующие операции над переменными этого типа: а) вычисление площади прямоугольника; б) построение прямоугольника по паре точек, задающих любую пару противолежащих вершин; в) построение пересечения двух прямоугольников; г) проверка принадлежности точки прямоугольнику; д) проверка включения одного прямоугольника в другой; е) поворот прямоугольника относительно центра на прямой угол. С использованием описанных типа и функций разработать программу, которая для заданного набора из N прямоугольников находит: 1) площадь наименьшего из прямоугольников, содержащего в себе один и более прямоугольников из заданного набора; 2) все пары прямоугольников, совпадающих с точностью до поворота на прямой угол.

При попытках тестирования функций появляются ошибки типа error C2660: Crossing: функция не принимает 1 аргументов
Но если объявить Rectangle A,B, то нужно заново заполнять эти параметры, A.x и т.д. уже используются в программе и снова появляется ошибка. Вообще, насколько понимаю, эта функция работает неправильно, т.к. в нее поступают не точки, а габариты прямоугольников.
Через Point A, Point B есть параметры только одного прямоугольника, что дает неверное решение.
Помогите разобраться.
Код:
#include <stdio.h>
#include <math.h>
#include <locale.h>

typedef struct//тип, описывающий прямоугольник
{
    int x;  
    int y;
} Rectangle;

typedef struct
{
    int x;
    int y;
}Point;

/*функция а)вычисление площади прямоугольника*/
float Area(Rectangle q)
{
    float S = 0;
    S = 4 * fabs((float(q.x))*(float(q.y)));
    return S;
}
/*функция б)построение прямоугольника по паре точек,
задающих любую пару противолежащих вершин*/

Rectangle For_two_points(Point A, Point B)
{
    Rectangle P;
    P.x = fabs((float(B.x) - float(A.x))/2);
    P.y = fabs((float(B.y) - float(A.y))/2);
    return P;
}
/*функция в)построение пересечения двух прямоугольников*/
Rectangle Crossing(Rectangle A, Rectangle B){
     Rectangle C;
    C.x = (A.x < B.x) ? A.x : B.x;
    C.y = (A.y < B.y) ? A.y : B.y;
    return C;
}
/*функция г) проверка принадлежности точки прямоугольнику*/
int Point_in_rectangle(Rectangle q){
    Point C;
    printf("Введите точку:n");
    scanf("%d%d", &C.x, &C.y);
    return ((C.y <= q.y) && (C.y >= -q.y) && (C.x <= q.x) && (C.x >= -q.x));
}
/*функция д) проверка включения одного прямоугольника в другой*/
int Inside(Rectangle A, Rectangle B)
{
    return ((A.x <= B.x && A.y <= B.y) || (A.x >= B.x && A.y >= B.y));
}
/*функция е) поворот прямоугольника относительно центра на прямой угол*/
Rectangle Turning(Rectangle q){
    int tmp = q.x;
    q.x=q.y;
    q.y=tmp;
    return q;
}

void main()
{
    setlocale(LC_ALL, "Russian");
    int N = 0,p;
    printf("nКоличество прямоугольников= ");
    scanf("%d", &N);
    Rectangle q[100];
    Rectangle c;
    printf("n");

    Point A, B;
    int i;  //счетчик
    for (i = 0; i < N; ++i)
    {
        printf("%d) Точки A, B: ", i + 1);
        scanf("%d%d%d%d", &A.x, &A.y, &B.x, &B.y);
        q[i] = For_two_points(A, B);
        p = Point_in_rectangle(q[i]);
        c = Crossing(q[i]);
    }

    printf("nВы ввели:n");
    printf("NtxtytПлощадьtТочкаtПересечениеn");
    for (i = 0; i < N; ++i)
        printf("%dt%dt%dt%.1ft%dt%dt%dn", i + 1, q[i].x, q[i].y, Area(q[i]),p,c.x,c.y);

    getchar();getchar();
}
27K
05 августа 2017 года
mnanorn
78 / / 01.12.2013
Файл заголовка librect.h
Код:
#ifndef LIBRECT_H
#define LIBRECT_H

#include <math.h>

#define FALSE       0
#define TRUE        !FALSE

#define ERRCENTER   -1

typedef struct{
    int x, y;
} POINT, *LPPOINT;

typedef struct{
    POINT top;
    POINT bottom;
} RECT, *LPRECT;

/* librect API */
int   getArea(RECT);
int   getRect(POINT, POINT, LPRECT);
int   getIntersectionRect(RECT, RECT, LPRECT);
int   isPointWithinRect(RECT, POINT);
int   isRectWithinRect(RECT, RECT);
int   rotateRect(LPRECT, LPPOINT, float*);
#endif // LIBRECT_H
Файл библиотеки librect.c
Код:
#include "librect.h"
#include <stdlib.h>

/**************** Service API *****************************/
int   isNullRect(RECT rc){
    int dx = rc.top.x - rc.bottom.x;
    int dy = rc.top.y - rc.bottom.y;

    return ((!dx && !dy) || !dx || !dy) ? TRUE : FALSE;
}

RECT  getNRect(RECT rc){
    RECT drc;

    if(isNullRect(rc))
        return rc;

    drc.top.x = (rc.top.x < rc.bottom.x) ? rc.top.x : rc.bottom.x;
    drc.top.y = (rc.top.y > rc.bottom.y) ? rc.top.y : rc.bottom.y;
    drc.bottom.x = (rc.top.x > rc.bottom.x) ? rc.top.x : rc.bottom.x;
    drc.bottom.y = (rc.top.y < rc.bottom.y) ? rc.top.y : rc.bottom.y;

    return drc;
}

POINT getCenter(RECT rc, int* state){
    POINT cnt;

    if(isNullRect(rc)){
        cnt.x = 0;
        cnt.y = 0;
        state ? *state = ERRCENTER : 0;
    }else{
        rc = getNRect(rc);
        cnt.x = (rc.bottom.x - rc.top.x) / 2 + rc.top.x;
        cnt.y = (rc.top.y - rc.bottom.y) / 2 + rc.bottom.y;
    }

    return cnt;
}

/***************** librect API ****************************/
int getArea(RECT rc){
    rc = getNRect(rc);

    if(isNullRect(rc))
        return 0;

    return (rc.bottom.x - rc.top.x) * (rc.top.y - rc.bottom.y);
}

int getRect(POINT top, POINT bottom, LPRECT rc){
    if(rc){
        rc->top.x = top.x;
        rc->top.y = top.y;
        rc->bottom.x = bottom.x;
        rc->bottom.y = bottom.y;
        return TRUE;
    }

    return FALSE;
}
int isPointWithinRect(RECT rc, POINT p){
    rc = getNRect(rc);

    if(isNullRect(rc))
        return FALSE;

    return ((p.x > rc.top.x)    && (p.x < rc.bottom.x) &&
            (p.y > rc.bottom.y) && (p.y < rc.top.y)) ? TRUE : FALSE;
}

int  isRectWithinRect(RECT rc1, RECT rc2){
    rc1 = getNRect(rc1);
    rc2 = getNRect(rc2);

    if((isNullRect(rc1) && isNullRect(rc2)) ||
       (getArea(rc2) >= getArea(rc1)))
        return FALSE;

    if(isPointWithinRect(rc1, rc2.top) && isPointWithinRect(rc1, rc2.bottom))
            return TRUE;

    return FALSE;
}

int rotateRect(LPRECT lprc, LPPOINT lpt, float* lpang){
    POINT cnt;
    float ang;

    if(!lprc || isNullRect(getNRect(*lprc)))
        return FALSE;

    *lprc = getNRect(*lprc);
    cnt = getCenter(*lprc, NULL);
    ang = 0.5;
    !lpt ? lpt = &cnt : NULL;
    !lpang ? lpang = &ang : NULL;

    lprc->top.x = (lpt->x) + ((lprc->top.x) - (lpt->x)) * cos(*lpang) - ((lprc->top.y) - (lpt->y)) * sin(*lpang);
    lprc->top.y = (lpt->y) + ((lprc->top.y) - (lpt->y)) * cos(*lpang) + ((lprc->top.x) - (lpt->x)) * sin(*lpang);

    lprc->bottom.x = (lpt->x) + ((lprc->bottom.x) - (lpt->x)) * cos(*lpang) - ((lprc->bottom.y) - (lpt->y)) * sin(*lpang);
    lprc->bottom.y = (lpt->y) + ((lprc->bottom.y) - (lpt->y)) * cos(*lpang) + ((lprc->bottom.x) - (lpt->x)) * sin(*lpang);

    return TRUE;
}
int  getIntersectionRect(RECT rc1, RECT rc2, LPRECT lprc){
    rc1 = getNRect(rc1);
    rc2 = getNRect(rc2);

    if(isNullRect(rc1) || isNullRect(rc2)){
        lprc = NULL;
        return FALSE;
    }

    if(rc1.bottom.y > rc2.top.y || rc1.top.y < rc2.bottom.y ||
       rc1.top.x > rc2.bottom.x || rc1.bottom.x <rc2.top.x){
        lprc = NULL;
        return FALSE;
       }

    if(lprc){
        lprc->top.x = (rc1.top.x > rc2.top.x) ? rc1.top.x : rc2.top.x;
        lprc->top.y = (rc1.top.y < rc2.top.y) ? rc1.top.y : rc2.top.y;
        lprc->bottom.x = (rc1.bottom.x < rc2.bottom.x) ? rc1.bottom.x : rc2.bottom.x;
        lprc->bottom.y = (rc1.bottom.y > rc2.bottom.y) ? rc1.bottom.y : rc2.bottom.y;
    }

    return TRUE;
}
27K
05 августа 2017 года
mnanorn
78 / / 01.12.2013
Будут вопросы: пиши на почту. Это - библиотека для работы с прямоугольниками. Нужные функции начинаются с lirect API Остальные - вспомогательные.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог