Задача На Прямоугольники

  • Автор темы KOMPNET
  • Дата начала
K

KOMPNET

#1
Даны положительные действительные числа a,b,c,d. Выяснить, можно ли один из прямоугольников целиком поместить внутри другого прямоугольника. Числа a,b определяют стороны 1 прямоугольника, а c и d второго прямоугольника, при условии, что прямоугольник можно поместить в другой прямоугольник под некоторым углом, хотя ширина его может быть больше, чем у другого. Вот тут как быть?
 
R

rrrFer

#2
интересная математическая задача. Я подумаю )
 
R

rrrFer

#3
щас набросал чето такое.
даны прямоугольники АхБ, ВхГ.

сначала надо упорядочить стороны так, чтобы было А меньше Б, В меньше Г.

а дальше такая формула получилась:

А = Г * синус( Ж ) + В * косинус( И )
Б = Г * косинус( Ж ) + В * синус( И )
Ж + И = 90

вот если возможно подобрать такие Ж и И - то прямоугольник ВхГ входит в АхБ.

Собственно надо написать функцию кототрая вот это проверяет и вызвать ее так, чтобы она сначала попыталась засунуть АхБ в ВхГ, а потом наоборот.

Решение не проверял, и не на 100% в нем уверен.
 
K

KOMPNET

#4
С точки зрения математики я сделал, но ват как это написать на Си?
 
K

KOMPNET

#7
Код:
#include <stdio.h>
#include <math.h>
#include <conio.h>
int main()
{float a,b,c,d,x,y;
x=2;
printf("Введите размеры 1 прямоугольника: а=");
scanf("%f", &a);
printf("в=");
scanf("%f", &b);
printf("Введите размеры 2 прямоугольника: c=");
scanf("%f", &c);
printf("d=");
scanf("%f", &d);
if ((a<c && b<d) || (a<d && b<c) || (b*sqrt(x)/2+a*sqrt(x)/2<=c))
printf("1 прямоугольник поместиться во 2");
else
if ((c<a && d<b) || (c<b && d<a) || (d*sqrt(x)/2+c*sqrt(x)/2<=a))
printf("2 прямоугольник поместиться во 1"); 
else
printf("Ничего не поместиться");
getch();			 
}
Но здесь работает только если вписывать под углом в квадрат, а для прямоугольника не знаю...
 
R

rrrFer

#8
че-то ерунда какая-то. не понимаю как вы к такому пришли.
если вписываете в квадрат - то зачем 4 стороны вводите?
Код:
 (b*sqrt(x)/2+a*sqrt(x)/2<=c)
тут что за х. На этот момент х не присвоено значение, вы используете неинициализированную переменную, а значит утверждение:
Но здесь работает только если вписывать под углом в квадрат
не верно, т.к. это ваще не работает. В переменой Х на этот момент мусор, но и нормальный компилятор предупредит вас об ошибке.
 
K

KOMPNET

#9
всё нормально компилируется. А как ты предлагаешь?
 

lazybiz

Well-known member
03.11.2010
1 339
0
#12
KOMPNET, тебе никто твои лабораторные и т.п. за тебя самого решать не будет!
Тот код что ты предоставил - содран. Более чем уверен, что ты даже не сможешь объяснить любую выбранную мной строчку этого кода.

Если тебе действительно это нужно, то можешь огласить цену. Возможно кто-то и возьмется.
 
31.10.2011
15
0
#13
СНАЧАЛО ОПРЕДЕЛИТЕ ЕСЛИ У ВАС ДАН КВАДРАТ (ПРОСТО РАДИУС ОПИСАНОЙ ОКРУЖНОСТИ ВНУТРЕННЕГО КВАДРАТА ДОЛЖЕН БЫТЬ СТРОГО МЕНЬШЕ РАДИУСА ВПИСАНОЙ ОКРУЖНОСТИ ВНЕШНЕГО КВАДРАТА)
ДЛЯ ПРЯМОУГОЛЬНИКА ТЕЖЕЛЕЕ. МОЖНО ПОПРОБЫВАТЬ ЧЕРЕЗ ТЕОРЕМУ ПИФАГОРА ... СДЕЛАЙТЕ СНАЧАЛО НА ЛИСТКЕ...
( НАРИСУЙТЕ 2 ПРЯМОУГОЛЬНИКА 1 ВПИСАНЫЙ ПОД УГЛОМ В ДРУГОЙ ИЗ ВЕРШИНУ СТРЕМЯЙЩЕЙСЯ К ВЕРХНЕЙ СТОРОНЕ ВНЕШНЕГО ПРЯМОУГОЛЬНИКА ПРОВЕДИТЕ ПЕРПЕНДИКУЛЯР К СТОРОНЕ ПРОВЕДЁННОЙ ИЗ ВЕРШИНЫ СТРЕМЯЩЕЙСЯ К НИЖНЕЙ СТОРОНЕ ВНЕШНЕГО ПРЯМОУГОЛЬНИКА ВОТ КАК НИЖЕ НА РИСУНКЕ ) ВЫВОД ====>>>>> ЕСЛИ ДЛИННА ПЕРПЕНДИКУЛЯРА " АБ " МЕНЬШЕ ЛЮБОЙ СТОРОНЫ ВНЕШНЕГО ПРЯМОУГОЛЬНИКА ТО ВПИСАТЬ МОЖНО ИНАЧЕ НЕЛЬЗЯ....
 

Вложения

lazybiz

Well-known member
03.11.2010
1 339
0
#14
Ванёк, а тебе не кажется что ты опоздал, эдак.. на месяц со своим ответом?!))
 

Vadik(R)

Well-known member
12.12.2007
469
0
#15
Блин, так это ж обычная олимпиадная задачу, уже не раз решал её :))
Просто под рукой готового исходника нет, так бы выложил.
Тут просто перебором угла
a => c * sin(fi) + d * cos(fi);
b => c * cos(fi) + d * sin(fi);
Всё решается по этим формулам.
 
R

rrrFer

#16
Всё решается по этим формулам.
примерно то же самое было предложено 6:10:2011, 17:26, только более правильно )
Ну я не так как Иван решал. У меня что-то типа индукции получалось.
[OFFTOP]Иван19994 отпусти shift[/OFFTOP]