LINUX.ORG.RU

Загадка: почему mouseX выводится как целое, а mouseY - число с плавающей запятой

 ,


1

1

Всех приветствую!

Собственно вопрос в заголовке темы.

Скриншот: здесь

Вывожу коорд. курсора мыши и в элементы, созданные js, так и в элемент , который уже присутствует в разметке.

Код для воспроизведения эффекта:

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<title>P5j  Test</title>
	<script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.0/p5.js"></script>
	
		<script>
			let inputX;
			let inputY;
			let elemP;
						
			function setup() {
  				let canvas = createCanvas(500, 500);
				background(64);
				canvas.parent('sketch-container');

				inputX = createInput('EmptyX');
				inputX.position(100, 100);

				inputY = createInput('EmptyY');
				inputY.position(100, 130);

				elemP = document.getElementById("Coords");
			}

			function draw() {
  				background(128);
				elemP.textContent=`x: ${mouseX} y: ${mouseY}`;
				//text(`x: ${mouseX} y: ${mouseY}`, 100, 70);

				if ( (mouseX>0 && mouseX < 500) && (mouseY>0 && mouseY < 500) )
				{	
					inputX.value(mouseX);
					inputY.value(mouseY);
				}
				else
				{	
					inputX.value('---');
					inputY.value('---');
				}

				if ( (mouseX>0 && mouseX < 500) && (mouseY>0 && mouseY < 500) )
				{
					ellipse(mouseX, mouseY, 15, 15);
				}
								
			}
		</script>


		<style type="text/css">
			body {
					font-family:"Arial";
					color:#493628;
					background:#C0C0C0}
		</style>
</head>
<body>
	<center>
		<h1>Приветствую Вас в P5j!</h1>
		<p="status">* * *</p>
		<p id="Coords"> </p>
		<div id="sketch-container">
 			
		</div>

		<p>* * *</p>
		<p>20 Марта 2025 by Gyros</p>
	</center>
</body>
</html>

Заранее благодарю за осмысленные ответы и замечания.



Последнее исправление: Gyros (всего исправлений: 2)

Загадка: почему mouseX выводится как целое, а mouseY - число с плавающей запятой

В чем загадка? Вы не можете открыть код используемой p5.js, найти функцию function getMousePos(canvas, w, h, evt) и посмотреть откуда при операции с границами холста c использованием деления берется дробная часть? Вы js-программист или где?

Obezyan
()
Ответ на: комментарий от Obezyan

Спасибо!

function getMousePos(canvas, w, h, evt) {
            if (evt && !evt.clientX) {
              // use touches if touch and not mouse
              if (evt.touches) {
                evt = evt.touches[0];
              } else if (evt.changedTouches) {
                evt = evt.changedTouches[0];
              }
            }
            var rect = canvas.getBoundingClientRect();
            var sx = canvas.scrollWidth / w || 1;
            var sy = canvas.scrollHeight / h || 1;
            return {
              x: (evt.clientX - rect.left) / sx,
              y: (evt.clientY - rect.top) / sy,
              winX: evt.clientX,
              winY: evt.clientY,
              id: evt.identifier
            };
          }

Т.е. sx=1, sy!=1.

Все равно легче от того, что я нашел эту ф-цию не стало.

x и y - это мышиные коорд.

А что такое canvas.scrollHeight?

w,h=500 - это р-ры кот задаются в let canvas = createCanvas(500, 500);

Gyros
() автор топика
Последнее исправление: Gyros (всего исправлений: 4)
Ответ на: комментарий от Gyros

Там сама getBoundingClientRect() возвращает уже дроби.

Причем - как повезёт, смотря где окно браузера - может и оба (left,top) вернуть дробными. А может и left целым, а top дробным.

DOMRect {x: 338.5, y: 147.875, width: 500, height: 500, top: 147.875, …}

Например.

*сохранил тот js локально, поиграл в console.log()*

Toxo2 ★★★★
()
Ответ на: комментарий от Gyros

А я не знаю, как хотите )

Я не веб-программист ни разу, просто хотел поиграть в эту игру - поиграл. Что там в кишках getBoundingClientRect() происходит я не знаю. И зачем вам обязательно целые - тем более не знаю.

Toxo2 ★★★★
()
Ответ на: комментарий от Toxo2

Я просто в кач-ве учебного примера вывожу коорд мыши.

И тут вот такое: одно целое, др - дробное.

Вот я и стал думать, м.б. что то у меня не так.

PS А что коорд мыши (на экране) разве могут быть дробными? Ведь нет же.

Gyros
() автор топика
Последнее исправление: Gyros (всего исправлений: 1)
Ответ на: комментарий от Gyros

Вон в примере из документации к getBoundingClientRect() же: https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_element_getboundi...

Просто toFixed() их обоих.

Авторы библиотеки p5 вероятно посчитали это лишним или недостаточно инклюзивным (как намекал тут товарищ).

Toxo2 ★★★★
()
Последнее исправление: Toxo2 (всего исправлений: 1)