1 (изменено: serzh82saratov, 2019-01-23 17:31:59)

Тема: AHK: Вписать один прямоугольник в другой

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

Предлагайте свои варианты, или может такое есть в WinApi.


#SingleInstance Force
#NoEnv 
ListLines Off
SetBatchLines -1 

AreaWidth := 800
AreaHeight := 800

ChildWidthOriginal := 1000
ChildHeightOriginal := 500

Gui, +HWNDhGui -DPIScale -Caption 
Gui, Show, Na y100 w%AreaWidth% h%AreaHeight%

Gui, New
Gui, +HWNDhParent -DPIScale -Caption +Parent%hGui%
Gui, Color, Red
Gui, Show, Na

Gui, New
Gui, +HWNDhChild -DPIScale -Caption +Parent%hGui%
Gui, Color, Yellow
Gui, Show, Na 

Loop
{
	ParentWidth := Random(200, AreaWidth - 200)
	ParentHeight := Random(200, AreaHeight - 200)  
	
	StretchToFit(ParentWidth, ParentHeight, ChildWidthOriginal, ChildHeightOriginal, ChildX, ChildY, ChildWidth, ChildHeight)
	; красный прямоугольник 
	Gui, %hParent%:Show, % "NA x" 100 " y" 100 " w" ParentWidth " h" ParentHeight
	; желтый прямоугольник 
	Gui, %hChild%:Show, % "NA x" 100 + ChildX " y" 100 + ChildY " w" ChildWidth " h" ChildHeight 
	
	MsgBox, 4096, , 
}
Return

StretchToFit(ParentWidth, ParentHeight, ChildWidthOriginal, ChildHeightOriginal, ByRef ChildX, ByRef ChildY, ByRef ChildWidth, ByRef ChildHeight) {
	ParentRatioW := ParentWidth / ParentHeight
	ChildRatioW := ChildWidthOriginal / ChildHeightOriginal
	
	ParentRatioH := ParentHeight / ParentWidth
	ChildRatioH := ChildHeightOriginal / ChildWidthOriginal
	
	ChildWidth := ParentRatioW < ChildRatioW ? ParentWidth : ParentWidth * (ChildRatioW / ParentRatioW)
	ChildHeight := ParentRatioH < ChildRatioH ? ParentHeight : ParentHeight * (ChildRatioH / ParentRatioH)
	
	ChildX := (ParentWidth - ChildWidth) / 2
	ChildY := (ParentHeight - ChildHeight) / 2
}

Random(min, max) {
	Random, rand, min, max
	Return rand
}

GuiEscape:
GuiClose:	
Escape:: ExitApp
ChildWidthOriginal := 1000
ChildHeightOriginal := 500

Задаются изначальные размеры желтого прямоугольника, для последующего получения соотношения его сторон.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

2 (изменено: serzh82saratov, 2019-01-23 23:05:46)

Re: AHK: Вписать один прямоугольник в другой

Хотя вроде не всё так страшно, но с WinApi наверное было бы предпочтительнее.


StretchToFit(ParentWidth, ParentHeight, ChildWidthOriginal, ChildHeightOriginal, ByRef ChildX, ByRef ChildY, ByRef ChildWidth, ByRef ChildHeight) {
	ParentRatioW := ParentWidth / ParentHeight
	ChildRatioW := ChildWidthOriginal / ChildHeightOriginal
	
	ParentRatioH := ParentHeight / ParentWidth
	ChildRatioH := ChildHeightOriginal / ChildWidthOriginal
	
	ChildWidth := ParentRatioW < ChildRatioW ? ParentWidth : ParentWidth * (ChildRatioW / ParentRatioW)
	ChildHeight := ParentRatioH < ChildRatioH ? ParentHeight : ParentHeight * (ChildRatioH / ParentRatioH)
	
	ChildX := (ParentWidth - ChildWidth) / 2
	ChildY := (ParentHeight - ChildHeight) / 2
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3

Re: AHK: Вписать один прямоугольник в другой

serzh82saratov пишет:

Задаются изначальные размеры желтого прямоугольника, для последующего получения соотношения его сторон.

Проще сразу задавать соотношение сторон, так как изначальные размеры не имеют значения.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

4

Re: AHK: Вписать один прямоугольник в другой

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

5 (изменено: teadrinker, 2019-01-23 21:31:39)

Re: AHK: Вписать один прямоугольник в другой

serzh82saratov пишет:

вычисляется два соотношения - ширина к высоте, и высота к ширине.

Тоже ни к чему, достаточно одного варианта, и смотреть, больше он единицы, или меньше. Кроме того, H/W = 1/(W/H).

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: Вписать один прямоугольник в другой

Думал про это, но что то не соображу.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

7 (изменено: teadrinker, 2019-01-23 22:48:59)

Re: AHK: Вписать один прямоугольник в другой

Как-то так:

AreaWidth := 800
AreaHeight := 800

yellowRatio := 1/2  ; H/W жёлтого прямоугольника

Gui, Area: New, -DPIScale
Gui, Color, E3E3E0
Gui, Show, w%AreaWidth% h%AreaHeight%

Gui, Red: New, +ParentArea -DPIScale -Caption
Gui, Color, Red

Gui, Yellow: New, +ParentRed -DPIScale -Caption
Gui, Color, Yellow

Loop {
   RedWidth := Random(200, AreaWidth - 200)
   RedHeight := Random(200, AreaHeight - 200)
   Gui, Red: Show, NA x100 y100 w%RedWidth% h%RedHeight%
   StretchYellow(RedWidth, RedHeight, yellowRatio)
   MsgBox, 4096,,
}
   
Random(min, max) {
   Random, rand, min, max
   Return rand
}

StretchYellow(ParentW, ParentH, ratio) {
   ParentRatio := ParentH/ParentW
   if (ParentRatio > ratio)
      W := ParentW, H := W*ratio, X := 0, Y := (ParentH - H)/2
   else
      H := ParentH, W := H/ratio, X := (ParentW - W)/2, Y := 0
   Gui, Yellow: Show, NA x%X% y%Y% w%W% h%H%
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8

Re: AHK: Вписать один прямоугольник в другой

Норм, я на "больше он единицы, или меньше" зациклился.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9

Re: AHK: Вписать один прямоугольник в другой

Или так:

StretchYellow(ParentW, ParentH, ratio) {
   ParentRatio := ParentH/ParentW
   bool := ParentRatio > ratio
   a := bool ? "W" : "H", b := bool ? "H" : "W", r := bool ? ratio : 1/ratio
   %a% := Parent%a%, %b% := %a% * r, X := (ParentW - W)/2, Y := (ParentH - H)/2
   Gui, Yellow: Show, NA x%X% y%Y% w%W% h%H%
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: Вписать один прямоугольник в другой

В таком уже завтра, сам не разберёшься.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui