Показать сообщение отдельно
  #2 (permalink)  
Старый 08.09.2019, 04:06
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

stavatar@yandex.ru, то, что у вас проверяется по формуле в handler.php, на графике выглядит так...
Формулу внутри условной конструкции на 17-ой строке можно упростить до
$Y < $R && $X < $R / 2 && $Y < -2 * $X + $R


Если же нужно именно...

...то выражение будет таким
$X <= 0 && $Y >= 0 && $X ** 2 + $Y ** 2 <= $R ** 2 ||
$X <= 0 && $Y <= 0 && -2 * $X - $R <= $Y ||
$X >= 0 && $Y <= 0 && $X <= $R / 2 && $Y >= -$R


Кстати проверку можно сделать без PHP. Вы можете проверить эти значения сразу после ввода. Можно даже начертить точку на графике.

<!DOCTYPE html>
<html>

<head>
	<title>Сайт</title>
	<style>
		body {
			background: #f6e8d7;
		}

		label {
			display: block;
			margin: 0.5em;
		}
		
		svg {
			width: 300px;
			height: 300px;
		}

	</style>
</head>

<body>
	<form method="get" action="handler.php" style="display: inline-block; ">
		<label>
			X
<!--			<input type="range" min="-2" max="2" step="any" name="InputX" required>-->
			<select name="InputX" required>
				<option>-2</option>
				<option>-1.5</option>
				<option>-1</option>
				<option>-0.5</option>
				<option>0</option>
				<option>0.5</option>
				<option>1</option>
				<option>1.5</option>
				<option>2</option>
			</select>
		</label>

		<label>
			Y
<!--			<input type="range" min="-3" max="3" step="any" name="InputY" required placeholder="От -3 до  3">-->
			<input type="number" min="-3" max="3" step="any" name="InputY" required placeholder="От -3 до  3">
		</label>

		<label>
			R
<!--			<input type="range" min="1" max="4" step="any" name="InputR" required placeholder="От 1 до 4">-->
			<input type="number" min="1" max="4" step="any" name="InputR" required placeholder="От 1 до 4">
		</label>

		<output>
			<p id="info">&nbsp;</p>
			<svg xmlns="http://www.w3.org/2000/svg" viewBox="-60 -60 120 120">
				<defs>
					<marker id="head" orient="auto" markerWidth="6" markerHeight="6" refX="5.5" refY="4">
						<path d="M0,2 l6,2 l-6,2" stroke="currentColor" fill="none" stroke-width="0.75" />
					</marker>
					<marker id="stop" orient="auto" markerWidth="6" markerHeight="6" refX="0" refY="4">
						<path d="M0,2 v4" stroke="currentColor" fill="none" stroke-width="2" />
					</marker>
				</defs>
				
				<path fill="#3399ff" d="M0,-50 A50,50 0,0,0 -50,0 L-25,0 L0,50 L25,50 L25,0 L0,0"></path>
<!--				<path fill="#3399ff" d="M-200,-50 L0,-50 L25,0 L25,200"></path>-->
				
				<g marker-mid="url(#stop)" marker-end="url(#head)" stroke-width="0.5" stroke="black">
					<path d="M-60,0 L-50,0 L-25,0 L25,0 L50,0 L60,0" />
					<path d="M0,60 L0,50 L0,25 L0,-25 L0,-50 L0,-60" />
				</g>
				
				<g style="font: italic 5px serif;">
					<text x="55" y="-2.5">x</text>
					<text x="2.5" y="-55">y</text>
					
				</g>
				
				<g style="font: 5px serif;" text-anchor="middle">
					<text x="50" y="-2.5">R</text>
					<text x="25" y="-2.5">R/2</text>
					<text x="2.5" y="-48.75" text-anchor="start">R</text>
					<text x="2.5" y="-23.75" text-anchor="start">R/2</text>
				</g>
				
				<circle r="2" fill="none" stroke="red" id="dot"></circle>
				
			</svg>
		</output>
	</form>

	<script>
		addEventListener("submit", event => {
			event.preventDefault();
		});
		
		addEventListener("input", event => {
			const data = new FormData(document.querySelector("form"));
			const dot = document.querySelector("#dot");
			const info = document.querySelector("#info");
			
			const $X = Number(data.get("InputX"));
			const $Y = Number(data.get("InputY"));
			const $R = Number(data.get("InputR"));
			
//			const f =
//				$Y < $R && $X < $R / 2 && $Y < -2 * $X + $R
//			;
			
			const f =
				$X <= 0 && $Y >= 0 && $X ** 2 + $Y ** 2 <= $R ** 2 ||
				$X <= 0 && $Y <= 0 && -2 * $X - $R <= $Y ||
				$X >= 0 && $Y <= 0 && $X <= $R / 2 && $Y >= -$R
			;
			
			dot.cx.baseVal.value = $X / $R * 50;
			dot.cy.baseVal.value = -$Y / $R * 50;
			
			dot.setAttribute("fill", f ? "red" : "none");
			info.textContent = f ?
				"Проверка пройдена.Точка попадает в график" :
				"Проверка не пройдена.Точка вне графика"
			;
		});
		
	</script>
</body>
</html>
Ответить с цитированием