Уроки, алгоритмы, программы, примеры

Вход на сайт

Материалы по разделам

Построения
на плоскости (2D)
Графика
в пространстве (3D)
Вычислительная
геометрия
Физическое
моделирование
Фрактальная
графика

Новые комментарии

Всем у кого не работает. файл wizard.script Ещё одно упоминание Glut32 в строке "if (!VerifyLibFile(dir_nomacro_lib, _T("glut32"), _T("GLUT's"))) return false;" меняем на "if (!VerifyLibFile(dir_nomacro_lib, _T("freeglut"), _T("GLUT's"))) return...
Не получается, емаё
огромное спасибо за подробное объяснение про 3д графику на питоне, в интернете очень мало подобной информации
dobryj den, popytalas otkryt prikreplionnyj fail ctoby posmotret kak rabotaet, no mne ego ne pokazyvaet vydajet osibku. Pochemu?
Очень интересно! ии сайт крутой жалко что умирает(

Счетчики и рейтинг

Рейтинг@Mail.ru Яндекс.Метрика
Демо JavaScript: 

<html>
	<head>
 
	</head>
	<body>
		<canvas id="canvas" width="500" height="500" style="border: 1px solid black" onclick="storeGuess(event)"></canvas>
		<script>
			let ctx = document.getElementById('canvas').getContext('2d')
			// отрисовка фона
			ctx.beginPath ()
			ctx.fillStyle = "blue"
			ctx.fillRect (0, 0, 500, 500)
			ctx.fillStyle = "green"
			ctx.fillRect (0, 300, 500, 500)
			ctx.stroke()
 
			let score = 0; // переменная, хранящая количество попаданий мышью по "ракете"
 
			// функция проверки попадения точки с координатами (х, у) в многоугольник, координаты которого находятся в массивах рХ[], рУ[]
			function PIP(x, y) {
				let parity = 0; // флаг четности
				for (let i = 1; i < pX.length; i ++) { // цикл, перебирающий все ребра многоугольника
					if (pY[i] - pY[i - 1] == 0) continue; // проверка горизонтальности ребра
					if (Math.max (pX[i], pX[i - 1]) > x) { // проверка расположения ребра многоугольника  (правее ли оно точки (х, у))
						if (Math.max (pY[i], pY[i - 1]) != y) { // проверка непопадания сканируещего луча на нижний конец ребра многоугольника 
							if (y - Math.max (pY[i], pY[i - 1]) < 0 && y - Math.min (pY[i], pY[i - 1]) >= 0) // проверка пересечения лучом ребра многоугольника
								parity = 1 - parity;
						}
					}
				}
				return parity
			}
 
 
			// функция обработки нажатия на холст
			function storeGuess(event) { 
				let coordX = event.offsetX, 
				    coordY = event.offsetY
				if (PIP(coordX, coordY)) score ++; // добавление очков, если нажатие попадает внутрь многоугольника
				console.log ("coord x: " + coordX + " coord y: " + coordY, PIP(coordX, coordY))
			}
 
 
			let x, y;
			x = -220;
			y = 220; // задание точек, относительно которых будем отрисовывать двигающиеся элементы
 
			let imgData = ctx.getImageData (0, 0, 500, 500);
 
 
			let pX = [],
			    pY = []; // массивы, хранящие координаты вершин многоугольника
 
 
			// функция отрисовки
			function draw()
			{
				ctx.putImageData (imgData, 0, 0);
				ctx.beginPath();
				// количество нажатий на ракету
				ctx.font = "20px Georgia";
				ctx.fillText ("Попадания ", 320, 25);
				ctx.fillText (score, 460, 25);
 
				ctx.fillStyle = "yellow";
				ctx.moveTo(x - 50, y + 30)
				ctx.lineTo(x - 100, y + 70)
				ctx.lineTo(x - 50, y + 50)
				ctx.fill()
 
 
 
				ctx.fillStyle = "red";
				ctx.moveTo(x - 50, y + 20)
				ctx.lineTo(x - 50, y + 50)
				ctx.lineTo(x - 80, y)
				ctx.fill()
 
				ctx.fillStyle = "red";
				ctx.strokeStyle = "black";
 
				ctx.fillRect (x, y, 200, 80);
				ctx.strokeRect (x, y, 200, 80);
 
				ctx.beginPath();
				ctx.moveTo(x, y + 10)
				ctx.lineTo(x - 50, y + 20)
				ctx.lineTo(x - 50, y + 50)
				ctx.lineTo(x, y + 70)
 
				ctx.moveTo(x + 200, y - 10)
				ctx.lineTo(x + 300, y + 40)
				ctx.lineTo(x + 200, y + 90)
				ctx.fillStyle = "grey"
				ctx.fill()
					// забивка массивов координат вершин многоугольника (координаты "хитбокса")
 
 
					pX[0] = x
					pY[0] = y
 
					pX[1] = x + 125
					pY[1] = y
					pX[2] = x + 125
					pY[2] = y - 35
					pX[3] = x + 205
					pY[3] = y - 35
					pX[4] = x + 205
					pY[4] = y + 45
					pX[5] = x + 150
					pY[5] = y + 45
					pX[6] = x + 150
					pY[6] = y + 100
				ctx.stroke();
 
				// смена направления движения
				if (x == -220) key = 1;
				if (x == 600) key = -1;
				x += key * 5;
 
			}
 
 
			setInterval(draw, 15); // создаем анимацию
 
 
		</script>
	</body>
</html>

Прикрепленный файлРазмер
lab5.zip1.7 кб