Описать тип struct Rectangle
При попытках тестирования функций появляются ошибки типа 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();
}
#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();
}
Код:
#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
#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
Код:
#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;
}
#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;
}
пиши на почту. Это - библиотека для работы с прямоугольниками. Нужные функции начинаются с lirect API Остальные - вспомогательные.
Будут вопросы: