JASS, Reforged
Итак я понял как делать высоту, я понял что такое GetTerrainZ и как она работает.
Итак смысл такой, мне нужно "просканировать" всю жёлтую область ( ореинтируясь от центра , т.е точку моей Ability Target Point)
и сделать так что бы все эффекты которые появятся были на высоте " допустим 100 + максимальная высота рельефа которая присутствует в жёлтой области"
Доходит туго, прошу поподробнее.

Принятый ответ

EviLInside, шаг меньше можно, только это увеличит работу цикла. Обычно шаг 32 используется для задачи мин клетке 32х32 тип паффинга, это я к примеру говорю что у варика сетка. даже ректы и регионы используют. А как высота строится, не знаю, сеточно ли? помню мне один пользователь Ральз скидывал на хайв xgm.guru/p/100/201676 А если у вас окружность огромная, то это сколько работы. можешь выложить в алгоритмы

код
library TerrainHeight

globals
  private location loc = Location(0, 0)
  real XH
  real YH
endglobals

function GetTerrainZ takes real x, real y returns real
  call MoveLocation(loc, x, y)
  return GetLocationZ(loc)
endfunction

function IsCoordsInCircle takes real x,real y,real rad,real cx,real cy returns boolean
	return (cx-x)*(cx-x)+(cy-y)*(cy-y)<rad*rad
endfunction

//Возвращает макс высоту в круге (а координаты в глобалках XH,YH)
function GetTerrainMaxZinRadius real cx, real cy, real rad returns real
local real maxH = GetTerrainZ(cx,cy)
//вершины квадрата
local real minx = cx-rad
local real miny = cy-rad
local real maxx = cx+rad
local real maxy = cy+rad
//координаты смещения
local real x = minx
local real y = miny
//мин шаг
local real block = 32.00

//инициирует координаты
set XH=cx
set YH=cy



loop
	exitwhen y>maxy
	
	set x = minx
	loop
		exitwhen x>maxx
		
		if IsCoordsInCircle(x,y,rad,cx,cy) then
		
			//если высота меньше, то записывает в maxH
			if maxH < GetTerrainZ(x,y) then
				set maxH = GetTerrainZ(x,y)
				set XH = x
				set YH = y
			endif
		
		endif
		
		
		set x = x + block
	endloop
	set y = y + block
endloop

return maxH
endfunction

endlibrary
код писал от руки, тк редактора не было. ошибки не должно быть,
`
ОЖИДАНИЕ РЕКЛАМЫ...
3
32
4 года назад
Отредактирован Берги
3
Эх ты
call AddSpecialEffectLocBJ( PolarProjectionBJ(Ltargetpoint, 220, Lradiusadd), "Abilities\\Weapons\\LordofFlameMissile\\LordofFlameMissile.mdl" )
set Leffect = GetLastCreatedEffectBJ()
call BlzSetSpecialEffectPitch( Leffect, math.rad(45.00) )
call BlzSetSpecialEffectHeight( Leffect, GetLocationZ(Ltargetpoint) +100)
Больше кода дай, и надо уйти от точек и сделать на координатах, я вообще не помню что такое полярка на точках
И тогда можно будет заюзать, то что я скидывал

мой код не работает скоре всего.. ибо тут чего-то не хватает, кароче надо в
call BlzSetSpecialEffectHeight( Leffect, GetLocationZ(Ltargetpoint) +100) передать высоту смещённой точки Ltargetpoint
2
27
4 года назад
Отредактирован MpW
2
Тут надо понять как деформируется рельеф по высоте. Проще брать сеточкой (карта состоит из клеток тайлов), как рассчитываете размер шага брать? мин шаг - 32 или 128?
1 берете заводите темп глобалку maxH, и координаты XH YH. в ней записываете высоту центра окружности и координаты XH YH
2 Можно взять квадрат, который вписан в окружность. или правильно сказать окружность вписанная в квадрат. путаю эти понятия. далее циклом пробегаете по каждой точке квадрата. и сравниваете размер высоты с maxH.
Цикл происходит так (описываю примерно): сначала от левого верхнего угла квадрата берем точку, и проверяем
2.1 лежит ли точка в окружности, это надо сравнить: расстояние этой точки от центра окружности <= radius круга. Если меньше значит попала точка, иначе если больше расстояние, значит точка не лежит в круге (значит лежит уголке квадрата), следовательно, высоту не имеет смысла проверять.
2.2 проверяем высоту. сравниваем высоту выбранной точки, если оно больше чем maxH, значит берем эту высоту и записываем в maxH и координаты этой точки в XH YH
А да не рассказал как цикл происходит. От левой границы квадрата смещаем точку справа шагом 32, короче смещается координата X - и расстояние и проверяем высоту. и так до сих пор пока не упрется в правую границу. Потом опускаем координату Y на 32, и снова двигаем от левой стороны до правой, и так до сих пор пока не упрется в нижнюю границу и цикл завершаем.

вот такое делал здесь xgm.guru/p/wc3/226281 тут есть пример где порчей точечно круг портил землю
1
10
4 года назад
1
МрачныйВорон:
Тут надо понять как деформируется рельеф по высоте. Проще брать сеточкой (карта состоит из клеток тайлов), как рассчитываете размер шага брать? мин шаг - 32 или 128?
1 берете заводите темп глобалку maxH, и координаты XH YH. в ней записываете высоту центра окружности и координаты XH YH
2 Можно взять квадрат, который вписан в окружность. или правильно сказать окружность вписанная в квадрат. путаю эти понятия. далее циклом пробегаете по каждой точке квадрата. и сравниваете размер высоты с maxH.
Цикл происходит так (описываю примерно): сначала от левого верхнего угла квадрата берем точку, и проверяем
2.1 лежит ли точка в окружности, это надо сравнить: расстояние этой точки от центра окружности <= radius круга. Если меньше значит попала точка, иначе если больше расстояние, значит точка не лежит в круге (значит лежит уголке квадрата), следовательно, высоту не имеет смысла проверять.
2.2 проверяем высоту. сравниваем высоту выбранной точки, если оно больше чем maxH, значит берем эту высоту и записываем в maxH и координаты этой точки в XH YH
А да не рассказал как цикл происходит. От левой границы квадрата смещаем точку справа шагом 32, короче смещается координата X - и расстояние и проверяем высоту. и так до сих пор пока не упрется в правую границу. Потом опускаем координату Y на 32, и снова двигаем от левой стороны до правой, и так до сих пор пока не упрется в нижнюю границу и цикл завершаем.
Cмысл я наверное понял - берём квадрат в который вписан мой круг, прогоняем по всем координатам квадрата, отсеиваем те места где круг не задевает квадрат, там где квадрат наложен на круг записываем высоту каждой "точки/(тут я как понял точки не будут каждая проверятся с шагом 1, а шаг типо 32 брать надо(ну если меньше можно то лучше). в глобалку, сверям меньше ли полученная высота которая записана в глобалке с новой высотой ,если появляется высота больше чем записано в глобалке ставим в глобалку новую более высокую высоту :) .
И тут самое интересное мои познания функций существующих для совершения некоторых действий которые описаны - очень скудные, да и правильность их использования что бы не через задний проход структурировался код и кучей лишних действий. Поэтому если не сложно и у кого то есть времени немного, сделайте на примере любой аое абилке.

Вообще мне кажется можно сделать функцию типо :
function GetTerrainMaxZinRadius takes "точка" , takes "радиус окружности от этой точки" return "МаксВысота в этом радиусе от точки"
И выложить её в статьях, кому то да пригодится возможно...Эх мечты.

*в этом круг от точки.
2
27
4 года назад
Отредактирован MpW
2
EviLInside, шаг меньше можно, только это увеличит работу цикла. Обычно шаг 32 используется для задачи мин клетке 32х32 тип паффинга, это я к примеру говорю что у варика сетка. даже ректы и регионы используют. А как высота строится, не знаю, сеточно ли? помню мне один пользователь Ральз скидывал на хайв xgm.guru/p/100/201676 А если у вас окружность огромная, то это сколько работы. можешь выложить в алгоритмы

код
library TerrainHeight

globals
  private location loc = Location(0, 0)
  real XH
  real YH
endglobals

function GetTerrainZ takes real x, real y returns real
  call MoveLocation(loc, x, y)
  return GetLocationZ(loc)
endfunction

function IsCoordsInCircle takes real x,real y,real rad,real cx,real cy returns boolean
	return (cx-x)*(cx-x)+(cy-y)*(cy-y)<rad*rad
endfunction

//Возвращает макс высоту в круге (а координаты в глобалках XH,YH)
function GetTerrainMaxZinRadius real cx, real cy, real rad returns real
local real maxH = GetTerrainZ(cx,cy)
//вершины квадрата
local real minx = cx-rad
local real miny = cy-rad
local real maxx = cx+rad
local real maxy = cy+rad
//координаты смещения
local real x = minx
local real y = miny
//мин шаг
local real block = 32.00

//инициирует координаты
set XH=cx
set YH=cy



loop
	exitwhen y>maxy
	
	set x = minx
	loop
		exitwhen x>maxx
		
		if IsCoordsInCircle(x,y,rad,cx,cy) then
		
			//если высота меньше, то записывает в maxH
			if maxH < GetTerrainZ(x,y) then
				set maxH = GetTerrainZ(x,y)
				set XH = x
				set YH = y
			endif
		
		endif
		
		
		set x = x + block
	endloop
	set y = y + block
endloop

return maxH
endfunction

endlibrary
код писал от руки, тк редактора не было. ошибки не должно быть,
Принятый ответ
Чтобы оставить комментарий, пожалуйста, войдите на сайт.