Re: Детская задачка для скучающих
От: rg45 СССР  
Дата: 26.02.17 10:45
Оценка: 30 (2) +1
Здравствуйте, kov_serg, Вы писали:

_>Есть два прямоугольника один со сторонами a,b и второй со сторонами c,d

_>Надо написать функцию проверки: можно ли разместить второй внутри первого

http://ideone.com/aHuEvc

bool first_enclose_second(double a, double b, double c, double d)
{
   if (a < b)
      std::swap(a, b);

   if (c < d)
      std::swap(c, d);

   if (c <= a)
      return d <= b;

   const auto ss = c * c + d * d;
   const auto p = std::sqrt(ss - b * b);
   const auto q = std::sqrt(ss - a * a);

   return a * b - p * q >= c * d * 2;
}


Случай "прямого" лежания, полагаю, не требует пояснений. Принцип решения для "косого" лежания пояснен рисунком. Решение основано на сравненииплошадей прямоугольников, вписанных в одну окружность (имеющих равные диагонали). Большую площадь будет иметь тот прямоугольник, который по форме более близок к квадрату.

Вписываем прямоугольник cd в окружность. Центр этой окружности совмещаем с центром прямоугольника ab. На точках пересечения окружности и прямоугольника ab строим вспомогательный прямоугольник, он изображен на рисунке зеленым цветом. Нетрудно доказать, что прямоугольник cd полностью размещается в прямоугольнике ab тогда и только тогда, когда площадь прямоугольника cd меньше или равна площади зеленого прямоугольника.

Для нахождения площади зеленого прямоугольника используем векторное произведение векторов его диагоналей (с коэффициентом 1/2). S = |(a,q)x(p,b)| / 2 = (a * b — p * q) / 2. Отрицательное значение площади означает, что диагональ прямоугольника cd больше диагонали прямоугольника ab. Этот случай не требует специальной обработки, т.к. используемые формулы покрывают его автоматически.

--
Не можешь достичь желаемого — пожелай достигнутого.
Детская задачка для скучающих
От: kov_serg Россия  
Дата: 28.12.16 14:56
Оценка: 26 (3)
Есть два прямоугольника один со сторонами a,b и второй со сторонами c,d
Надо написать функцию проверки: можно ли разместить второй внутри первого
Re[3]: Детская задачка для скучающих
От: Qulac Россия  
Дата: 05.01.17 18:43
Оценка: +1 :)
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, kov_serg, Вы писали:


_>>>Есть два прямоугольника один со сторонами a,b и второй со сторонами c,d

_>>>Надо написать функцию проверки: можно ли разместить второй внутри первого

_>>bool f(double a,double b, double c,doube d);


_>>вот данные для проверки функции

_>>f(2,2, 1,1)=true
_>>f(1,1, 2,2)=false
_>>f(5,5, 5.5,1)=true

V>Ну да, школьная задача по геометрии.


V>Тут можно найти, например, максимальный D:

V>Image: ABCD.png

V>Т.е., дано A, B, C, находим отсюда D(max).

V>Затем, если исходное D<=Dmax, то true.

V>Перед этим проверить:

V>С2 <= A2 + B2, если условие не соблюдается, то поменять (A,B) <=> (C,D)

V>Значение D можно найти из суммы площадей треугольников:

V>A1*B1 + A2*B2 = A*B — C*D
V>и их сторон:
V>С2 = A12 + B12
V>D2 = A22 + B22

V>Расписывать и форматировать решение облом, но понятно, что имеем 3 уравнения для 3-х неизвестных (A1, B1, D).

V>(ну или 5 уравнений для 5 неизвестных до подстановки: A2=A-A1 и B2=B-B1)

В том то и дело, что расписывать всем в облом, а не только тебе
Программа – это мысли спрессованные в код
Re[5]: Детская задачка для скучающих
От: kov_serg Россия  
Дата: 06.01.17 21:21
Оценка: 14 (1)
Здравствуйте, vdimas, Вы писали:

_>>Вообще-то получается всего два неравенства для одной переменной.

V>Не получается "всего два".
V>Я не вижу в этих неравенствах формулы вычисления угла a.
Странно, почему я вижу

V>Собсно, твои неравенства эквивалентны (математически, после подстановок) моим:

Ясен пень эквивалентны. Но решение в такой системе координат проще.

V>Но это не есть решение задачи, это всё еще формулировка/уточнение условия. ))

V>Решение — это найти "угол вписывания" одного прямоугольника в другой и проверить данное условие.
Если вам нужен угол то смотрите
  полное решение неравенства

d2*sin(f2)*sin(a) + d2*cos(f2)*cos(a) <= d1*cos(f1)
d2*sin(f2)*cos(a) + d2*cos(f2)*sin(a) <= d1*sin(f1)
0 < f1 < pi/2
0 < f2 < pi/2
0 <= a <= p/2

Переобразуем
cos(a-f2) <= q1 , q1=d1/d2*cos(f1)
sin(a+f2) <= q2 , q2=d1/d2*sin(f1)

замена переменных
a1=d1*sin(f1)
b1=d1*cos(f1)
a2=d2*sin(f2)
b2=d2*cos(f2)

одна неизвестная a — угол поворота второго прямоугольника относительно первого

function find_angles(d1,f1,d2,f2)
    local p2,r,rs,q1,q2=0.5*math.pi,{},{}
    q1=d1/d2*math.cos(f1)
    if q1<=1 then r[#r+1]={ f2, math.acos(q1) } end
    q2=d1/d2*math.sin(f1)
    if q2<=1 then r[#r+1]={ p2-f2, math.acos(q2) } end
    local function rgn(r1,r2) if r1<=r2 then rs[#rs+1]={r1,r2} end end
    if #r==0 then rs={ {0,p2} } 
    else 
        if #r==2 then
            if r[1][1]>r[2][2] then r={ r[2],r[1] } end
            if r[1][1]+r[1][2]>=r[2][1]-r[2][2] then
                r={{ 0.5*(r[1][1]-r[1][2]+r[2][1]+r[2][2]),
                     0.5*(r[2][1]+r[2][2]-r[1][1]+r[1][2]) }}
            end
        end
        if #r==1 then
            rgn(0,r[1][1]-r[1][2])
            rgn(r[1][1]+r[1][2],p2)
        else
            rgn(0,r[1][1]-r[1][2])
            rgn(r[1][1]+r[1][2],r[2][1]-r[2][2])
            rgn(r[2][1]+r[2][2],p2)
        end
    end
    return rs
end

find_angles возвращает все решения (допустимые диапазоны) для угла a (границы включаются)

_>>Вот код решения на скорую руку
V>Код решения не соответствует приведенным неравенствам.
Точно ошибся. Посыпает голову пеплом.
Вот правильный вариант
#!/usr/bin/lua

function rect_fit(a1,b1,a2,b2)
    local d1,f1=math.sqrt(a1*a1+b1*b1), math.atan2(a1,b1)
    local d2,f2=math.sqrt(a2*a2+b2*b2), math.atan2(a2,b2)
    local function can_fit(d1,f1,d2,f2)
        local p2,r,rs,q1,q2=0.5*math.pi,{}
        q1=d1/d2*math.cos(f1); if q1<=1 then r[1]={ f2, math.acos(q1) } end
        q2=d1/d2*math.sin(f1); if q2<=1 then r[#r+1]={ p2-f2, math.acos(q2) } end
        rs=(#r==0) or (#r==1 and ( r[1][1]>=r[1][2] or r[1][1]+r[1][2]<=p2 ))
        if #r==2 then 
            if r[1][1]>r[2][2] then r={ r[2],r[1] } end
            rs=math.min(r[1][1]-r[1][2],r[2][1]-r[2][2])>=0
            or math.max(r[2][1]+r[2][2],r[1][1]+r[1][2])<=p2
            or r[1][1]+r[1][2]<=r[2][1]-r[2][2]
        end
        return rs
    end
    return can_fit(d1,f1,d2,f2)
end

function check_list(list)
    for k,v in pairs(list) do
        local r=rect_fit(v.a1,v.b1,v.a2,v.b2) and 'possible' or 'impossible'
        print(string.format("[%.3f * %.3f] <-- [%.3f * %.3f] - %s",v.a1,v.b1,v.a2,v.b2,r))
    end
end

check_list
{ 
    { a1=2,b1=2, a2=1,b2=1 },
    { a1=1,b1=1, a2=2,b2=2 },
    { a1=5,b1=5, a2=5.5,b2=1 },
}

Выхлоп
[2.000 * 2.000] <-- [1.000 * 1.000] - possible
[1.000 * 1.000] <-- [2.000 * 2.000] - impossible
[5.000 * 5.000] <-- [5.500 * 1.000] - possible
Отредактировано 06.01.2017 22:23 kov_serg . Предыдущая версия . Еще …
Отредактировано 06.01.2017 22:21 kov_serg . Предыдущая версия .
Отредактировано 06.01.2017 22:20 kov_serg . Предыдущая версия .
Отредактировано 06.01.2017 21:41 kov_serg . Предыдущая версия .
Отредактировано 06.01.2017 21:26 kov_serg . Предыдущая версия .
Re[2]: Детская задачка для скучающих
От: Михaил  
Дата: 28.12.16 18:47
Оценка: 1 (1)
Здравствуйте, Qulac, Вы писали:

Q>Здравствуйте, kov_serg, Вы писали:


_>>Есть два прямоугольника один со сторонами a,b и второй со сторонами c,d

_>>Надо написать функцию проверки: можно ли разместить второй внутри первого

Q>у вложенного прямоугольника все из сторон меньше хотя бы одной стороны прямоугольника включающего его. Это легко записать:


Q>(a>c||b>c)&&(a>d||b>d)


А если вложить "по диагонали"? Очень "тонкий" прямоугольник высотой epsilon, но с длиной немного меньшей длины диагонали включающего прямоугольника. Его сторона будет больше самой большой стороны включающего прямоугольника
Re: Детская задачка для скучающих
От: · Великобритания  
Дата: 28.12.16 17:18
Оценка: :)
Здравствуйте, kov_serg, Вы писали:

_>Есть два прямоугольника один со сторонами a,b и второй со сторонами c,d

_>Надо написать функцию проверки: можно ли разместить второй внутри первого
return min(a,b)<=min(c,d) && max(a,b)<=max(c,d)
угадал?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Детская задачка для скучающих
От: Михaил  
Дата: 28.12.16 18:09
Оценка: +1
Здравствуйте, kov_serg, Вы писали:

SO>>Крутить можно?


_>Нужно


  Скрытый текст
Если в лоб и без хитростей

с<a && d<b || c<b && d<a
Re[3]: Детская задачка для скучающих
От: Qulac Россия  
Дата: 28.12.16 19:05
Оценка: -1
Здравствуйте, Михaил, Вы писали:

М>Здравствуйте, Qulac, Вы писали:


Q>>Здравствуйте, kov_serg, Вы писали:


_>>>Есть два прямоугольника один со сторонами a,b и второй со сторонами c,d

_>>>Надо написать функцию проверки: можно ли разместить второй внутри первого

Q>>у вложенного прямоугольника все из сторон меньше хотя бы одной стороны прямоугольника включающего его. Это легко записать:


Q>>(a>c||b>c)&&(a>d||b>d)


М>А если вложить "по диагонали"? Очень "тонкий" прямоугольник высотой epsilon, но с длиной немного меньшей длины диагонали включающего прямоугольника. Его сторона будет больше самой большой стороны включающего прямоугольника


+1.
Я рассматривал случай когда стороны параллельны. А тут надо че-то другое сравнивать. Может периметр или окружности описывающие прямоугольники. Наверное окружности.

UP. Диагональ нужно сравнивать, если диагональ меньше, то влезет. Вроде так...
Программа – это мысли спрессованные в код
Отредактировано 28.12.2016 19:27 Qulac . Предыдущая версия . Еще …
Отредактировано 28.12.2016 19:08 Qulac . Предыдущая версия .
Re[4]: Детская задачка для скучающих
От: Alexander G Украина  
Дата: 28.12.16 19:52
Оценка: +1
Здравствуйте, Qulac, Вы писали:

Q>UP. Диагональ нужно сравнивать, если диагональ меньше, то влезет. Вроде так...



Не. Пусть один квадрат, другой, с чутка большей диагональю — сильно неквадрат.
Ну и как квадрат влезет, если он тупо по площади больше.
Русский военный корабль идёт ко дну!
Re[2]: Детская задачка для скучающих
От: kov_serg Россия  
Дата: 29.12.16 09:06
Оценка: +1
Здравствуйте, ·, Вы писали:

·>Здравствуйте, kov_serg, Вы писали:


_>>Есть два прямоугольника один со сторонами a,b и второй со сторонами c,d

_>>Надо написать функцию проверки: можно ли разместить второй внутри первого
·>return min(a,b)<=min(c,d) && max(a,b)<=max(c,d)
·>угадал?

нет
Re: Детская задачка для скучающих
От: SergeyOsipov Россия  
Дата: 28.12.16 15:48
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Есть два прямоугольника один со сторонами a,b и второй со сторонами c,d

_>Надо написать функцию проверки: можно ли разместить второй внутри первого

Крутить можно?

(a-c)*(b-d)>0
Re[2]: Детская задачка для скучающих
От: kov_serg Россия  
Дата: 28.12.16 16:26
Оценка:
Здравствуйте, SergeyOsipov, Вы писали:

SO>Здравствуйте, kov_serg, Вы писали:


_>>Есть два прямоугольника один со сторонами a,b и второй со сторонами c,d

_>>Надо написать функцию проверки: можно ли разместить второй внутри первого

SO>Крутить можно?


Нужно
Re: Детская задачка для скучающих
От: Qulac Россия  
Дата: 28.12.16 18:14
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Есть два прямоугольника один со сторонами a,b и второй со сторонами c,d

_>Надо написать функцию проверки: можно ли разместить второй внутри первого

у вложенного прямоугольника все из сторон меньше хотя бы одной стороны прямоугольника включающего его. Это легко записать:

(a>c||b>c)&&(a>d||b>d)
Программа – это мысли спрессованные в код
Отредактировано 28.12.2016 18:32 Qulac . Предыдущая версия . Еще …
Отредактировано 28.12.2016 18:27 Qulac . Предыдущая версия .
Re[4]: Детская задачка для скучающих
От: Михaил  
Дата: 28.12.16 19:33
Оценка:
Здравствуйте, Qulac, Вы писали:

Q>Здравствуйте, Михaил, Вы писали:


М>>Здравствуйте, Qulac, Вы писали:


Q>>>Здравствуйте, kov_serg, Вы писали:


_>>>>Есть два прямоугольника один со сторонами a,b и второй со сторонами c,d

_>>>>Надо написать функцию проверки: можно ли разместить второй внутри первого

Q>>>у вложенного прямоугольника все из сторон меньше хотя бы одной стороны прямоугольника включающего его. Это легко записать:


Q>>>(a>c||b>c)&&(a>d||b>d)


М>>А если вложить "по диагонали"? Очень "тонкий" прямоугольник высотой epsilon, но с длиной немного меньшей длины диагонали включающего прямоугольника. Его сторона будет больше самой большой стороны включающего прямоугольника


Q>+1.

Q>Я рассматривал случай когда стороны параллельны. А тут надо че-то другое сравнивать. Может периметр или окружности описывающие прямоугольники. Наверное окружности.

Q>UP. Диагональ нужно сравнивать, если диагональ меньше, то влезет. Вроде так...


Тогда a^2 + b^2 > c^2 + d^2
А как это можно доказать?
Re: Детская задачка для скучающих
От: kov_serg Россия  
Дата: 29.12.16 07:01
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Есть два прямоугольника один со сторонами a,b и второй со сторонами c,d

_>Надо написать функцию проверки: можно ли разместить второй внутри первого

bool f(double a,double b, double c,doube d);

вот данные для проверки функции
f(2,2, 1,1)=true
f(1,1, 2,2)=false
f(5,5, 5.5,1)=true
Re[4]: Детская задачка для скучающих
От: kov_serg Россия  
Дата: 29.12.16 07:04
Оценка:
Здравствуйте, Михaил, Вы писали:

М>Здравствуйте, kov_serg, Вы писали:


SO>>>Крутить можно?


_>>Нужно


М>Если в лоб и без хитростей


М>с<a && d<b || c<b && d<a


не правильно. вы не достаточно скуали a=5, b=5, c=5.5 d=1 должно быть да
Re[2]: Детская задачка для скучающих
От: vdimas Россия  
Дата: 05.01.17 17:07
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>>Есть два прямоугольника один со сторонами a,b и второй со сторонами c,d

_>>Надо написать функцию проверки: можно ли разместить второй внутри первого

_>bool f(double a,double b, double c,doube d);


_>вот данные для проверки функции

_>f(2,2, 1,1)=true
_>f(1,1, 2,2)=false
_>f(5,5, 5.5,1)=true

Ну да, школьная задача по геометрии.

Тут можно найти, например, максимальный D:


Т.е., дано A, B, C, находим отсюда D(max).
Затем, если исходное D<=Dmax, то true.

Перед этим проверить:
С2 <= A2 + B2, если условие не соблюдается, то поменять (A,B) <=> (C,D)

Значение D можно найти из суммы площадей треугольников:
A1*B1 + A2*B2 = A*B — C*D
и их сторон:
С2 = A12 + B12
D2 = A22 + B22

Расписывать и форматировать решение облом, но понятно, что имеем 3 уравнения для 3-х неизвестных (A1, B1, D).
(ну или 5 уравнений для 5 неизвестных до подстановки: A2=A-A1 и B2=B-B1)
Re[4]: Детская задачка для скучающих
От: vdimas Россия  
Дата: 05.01.17 18:47
Оценка:
Здравствуйте, Qulac, Вы писали:

Q>В том то и дело, что расписывать всем в облом, а не только тебе


Ну да. Это не такая задача, где надо "догадаться". Интереса нет.
Re: Детская задачка для скучающих
От: Икс Россия  
Дата: 05.01.17 19:00
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Есть два прямоугольника один со сторонами a,b и второй со сторонами c,d

_>Надо написать функцию проверки: можно ли разместить второй внутри первого

Уже написана, "IntersectRect" называется
Re[4]: Детская задачка для скучающих
От: vdimas Россия  
Дата: 05.01.17 20:03
Оценка:
Здравствуйте, Qulac, Вы писали:

Ну вот ввел свои формулы в wolfram alpha для заданных:
a=5, b=5, c=5.5, dmax=?

там 4 результата(a1=x, b1=y), отбрасываем отрицательные, остаётся единственный ответ.
Итого, dmax=~1.57107
т.е., в случае d=1 ответ будет true, ЧТД.
Re[2]: Детская задачка для скучающих
От: ylp  
Дата: 05.01.17 22:14
Оценка:
Здравствуйте, Икс, Вы писали:

Икс>Здравствуйте, kov_serg, Вы писали:


_>>Есть два прямоугольника один со сторонами a,b и второй со сторонами c,d

_>>Надо написать функцию проверки: можно ли разместить второй внутри первого

Икс>Уже написана, "IntersectRect" называется

В задании ничего не говорится про то, как ориентированы прямоугольники.
Re[3]: Детская задачка для скучающих
От: kov_serg Россия  
Дата: 05.01.17 23:43
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Ну да, школьная задача по геометрии.


V>Расписывать и форматировать решение облом, но понятно, что имеем 3 уравнения для 3-х неизвестных (A1, B1, D).

V>(ну или 5 уравнений для 5 неизвестных до подстановки: A2=A-A1 и B2=B-B1)

Задача из экзаменационных билетов по информатике для студентов.
Вообще-то получается всего два неравенства для одной переменной.
Делаем замену переменных
a1=d1*cos(f1)
b1=d1*sin(f1)
a2=d2*cos(f2)
b2=d2*sin(f2)

Получаем неравенство:

d2*sin(f2)*sin(a)+d2*cos(f2)*cos(a) <= d1*cos(f1)
d2*sin(f2)*cos(a)+d2*cos(f2)*sin(a) <= d1*sin(f1)


Вот код решения на скорую руку
#!/usr/bin/lua

function check_rect(a1,b1,a2,b2)
    local find_angles=function (d1,a1,d2,a2)
        local q1,q2,p2,r
        p2=0.5*math.pi
        q2=d1/d2*math.sin(a1)
        r={ a2, a2+p2 }
        if q2<=1 then
            u1=math.acos(q2)
            if r[2]<u1 then return {} end
            if a2<u1 then r[1]=u1 end
        end
        q1=d1/d2*math.cos(a1)
        if q1>1 then return {r} end
        v1=math.asin(q1)
        if v1>=r[1] then r={ {r[1],v1} } else r={} end
        if a2+v1>=p2 then r[#r+1]={ p2-v1,a2+p2 } end
        return r
    end
    local d1,f1,d2,f2,r
    d1=math.sqrt(a1*a1+b1*b1); f1=math.atan2(b1,a1)
    d2=math.sqrt(a2*a2+b2*b2); f2=math.atan2(b2,a2)
    r=find_angles(d1,f1,d2,f2)
    -- for k,v in pairs(r) do print(string.format('%d [%.3f, %.3f]',k,v[1],v[2])) end    
    return #r>0
end

function check_list(list)
    for k,v in pairs(list) do
        local r=check_rect(v.a1,v.b1,v.a2,v.b2) and 'possible' or 'impossible'
        print(string.format("[%.3f * %.3f] <-- [%.3f * %.3f] - %s",v.a1,v.b1,v.a2,v.b2,r))
    end
end

check_list
{ 
    { a1=2,b1=2, a2=1,b2=1 },
    { a1=1,b1=1, a2=2,b2=2 },
    { a1=5,b1=5, a2=5.5,b2=1 },
}

Выдача
[2.000 * 2.000] <-- [1.000 * 1.000] - possible
[1.000 * 1.000] <-- [2.000 * 2.000] - impossible
[5.000 * 5.000] <-- [5.500 * 1.000] - possible
Отредактировано 05.01.2017 23:57 kov_serg . Предыдущая версия . Еще …
Отредактировано 05.01.2017 23:53 kov_serg . Предыдущая версия .
Re[4]: Детская задачка для скучающих
От: vdimas Россия  
Дата: 06.01.17 02:39
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Вообще-то получается всего два неравенства для одной переменной.


Не получается "всего два".
Я не вижу в этих неравенствах формулы вычисления угла a.

Собсно, твои неравенства эквивалентны (математически, после подстановок) моим:

С2 <= A2 + B2, если условие не соблюдается, то поменять (A,B) <=> (C,D)
если исходное D<=Dmax, то true


Но это не есть решение задачи, это всё еще формулировка/уточнение условия. ))
Решение — это найти "угол вписывания" одного прямоугольника в другой и проверить данное условие.


_>Вот код решения на скорую руку


Код решения не соответствует приведенным неравенствам.

===========
В моем случае после 2-х подстановок получилось обычное уравнение 4-й степени.
Расписывать его решение и было облом, сорри.

Upd
Собственно, нахождение треугольника(ов) A1 B1 C на моём рисунке и есть нахождение твоего угла(ов) а.

=============
Есть еще способ решения — через подобие всех треугольников, я там проекцию на C специально оставил.
Отредактировано 06.01.2017 2:46 vdimas . Предыдущая версия . Еще …
Отредактировано 06.01.2017 2:46 vdimas . Предыдущая версия .
Re: Детская задачка для скучающих
От: Hacker_Delphi Россия  
Дата: 26.02.17 08:40
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Есть два прямоугольника один со сторонами a,b и второй со сторонами c,d

_>Надо написать функцию проверки: можно ли разместить второй внутри первого

(a,b,c,d) => Min(a,b) > Min(c,d) && (a*a + b*b) > (c*c + d*d) || Min(a, b) == Min(c,d) && Max(a,b) >= Max(c, d)
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re[2]: Детская задачка для скучающих
От: kov_serg Россия  
Дата: 26.02.17 10:30
Оценка:
Здравствуйте, Hacker_Delphi, Вы писали:

H_D>Здравствуйте, kov_serg, Вы писали:


_>>Есть два прямоугольника один со сторонами a,b и второй со сторонами c,d

_>>Надо написать функцию проверки: можно ли разместить второй внутри первого

H_D>
H_D>(a,b,c,d) => Min(a,b) > Min(c,d) && (a*a + b*b) > (c*c + d*d) || Min(a, b) == Min(c,d) && Max(a,b) >= Max(c, d)
H_D>

Какой результат будет у этой функции при a=1 b=1.65, c=0.7 d=1.79

Отредактировано 26.02.2017 10:47 kov_serg . Предыдущая версия .
Re[3]: Детская задачка для скучающих
От: Hacker_Delphi Россия  
Дата: 26.02.17 13:25
Оценка:
Здравствуйте, kov_serg, Вы писали:

H_D>>
H_D>>(a,b,c,d) => Min(a,b) > Min(c,d) && (a*a + b*b) > (c*c + d*d) || Min(a, b) == Min(c,d) && Max(a,b) >= Max(c, d)
H_D>>

_>Какой результат будет у этой функции при a=1 b=1.65, c=0.7 d=1.79

Ыш ты... лоханулсо... ну шоподеладь....
Ладно, тогда подумаю ышшо.
так и подмывает заменить условие на такое:
(a,b,c,d) => Min(a,b) > Min(c,d) && Max(a, b) * Max(a,b) > (c*c + d*d) || Min(a, b) == Min(c,d) && Max(a,b) >= Max(c, d)

Как в том анекдоте:

Вот Петька, нутром чую, что литр... а обосновать — не могу

... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Если при компиляции и исполнении вашей программы не происходит ни одной ошибки — это ошибка компилятора :)))
Re: Детская задачка для скучающих
От: Кодт Россия  
Дата: 02.03.17 11:20
Оценка:
Здравствуйте, kov_serg, Вы писали:

_>Есть два прямоугольника один со сторонами a,b и второй со сторонами c,d

_>Надо написать функцию проверки: можно ли разместить второй внутри первого

Обойдёмся без тригонометрии (точнее, спрячем её внутрь квадратных уравнений)



Дано: C, D — константы, и давайте сразу отнормируем их так, что C = 1, C <= D. Соответственно отнормируем A и B, и пусть A <= B.

Сx — переменная, 0 <= Cx <= 1. Прозорливый читатель узнает в этой величине синус угла поворота.
Cy = √(1-Cx²). Это, соответственно, косинус.
Dy = D·Cx
Dx = D·Cy = D·√(1-Cx²)

Получаем три уравнения
0 <= Cx <= 1
Cx + Dx <= A
Cy + Dy <= B

Cx + D·√(1-Cx²) <= A
D²·(1-Cx²) <= (A-Cx)²
(1-Cx²) <= (A-Cx)²

D·Cx + √(1-Cx²) <= B
(1-Cx²) <= (B-Cx·D)²
(1-Cx²)·D² <= (B-Cx·D)²·D²

Вычтем:
0 <= (A-Cx)²-(B-Cx·D)²·D²
(A-Cx)² <= (B-Cx·D)²·D²
A-Cx <= (B-Cx·D)·D
A-B·D <= Cx·(1-D)

(B·D-A)/(D-1) <= Cx <= 1

/* на этом мысль иссякла, надо и поработать, однако... */
Перекуём баги на фичи!
Re[2]: Детская задачка для скучающих
От: paucity  
Дата: 07.03.17 17:20
Оценка:
Здравствуйте, Кодт, Вы писали:

_>>Есть два прямоугольника один со сторонами a,b и второй со сторонами c,d

_>>Надо написать функцию проверки: можно ли разместить второй внутри первого

К>Обойдёмся без тригонометрии (точнее, спрячем её внутрь квадратных уравнений)




Если сумма площадей четырех треугольников и меньшего прямоугольника меньше или равна площади большего прямоугольника, то вписывается, если сумма площадей треугольников и меньшего прямоугольника больше площади большего прямоугольника, то не вписывается.

ИМХО, решение можно вывести, используя теорему Пифагора (остатки школьной математики в голове навевают, что можно), но лень не дает взять карандаш в руки
Отредактировано 07.03.2017 17:21 paucity . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.