Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Processing:Примеры/Объект, тянущийся к курсору 3

Материал из Онлайн справочника
Перейти к: навигация, поиск


Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Ambox content.png Черновик


Описание[1]

Этот скетч-пример основан на коде Кита Питерса. Здесь «щупальце» пытается дотянуться до эллипса, скачущего по экрану. Углы рассчитываются при помощи функции atan2().

Пример

  1. int numSegments = 8;
  2. float[] x = new float[numSegments];
  3. float[] y = new float[numSegments];
  4. float[] angle = new float[numSegments];
  5. float segLength = 26;
  6. float targetX, targetY;
  7.  
  8. float ballX = 50;
  9. float ballY = 50;
  10. int ballXDirection = 1;
  11. int ballYDirection = -1;
  12.  
  13. void setup() {
  14.   size(640, 360);
  15.   strokeWeight(20.0);
  16.   stroke(255, 100);
  17.   noFill();
  18.   x[x.length-1] = width/2;     // координата X для основы «щупальца»
  19.   y[x.length-1] = height;  // координата Y для основы «щупальца»
  20. }
  21.  
  22. void draw() {
  23.   background(0);
  24.  
  25.   strokeWeight(20);
  26.   ballX = ballX + 1.0 * ballXDirection;
  27.   ballY = ballY + 0.8 * ballYDirection;
  28.   if(ballX > width-25 || ballX < 25) {
  29.     ballXDirection *= -1;
  30.   }
  31.   if(ballY > height-25 || ballY < 25) {
  32.     ballYDirection *= -1;
  33.   }
  34.   ellipse(ballX, ballY, 30, 30);
  35.  
  36.   reachSegment(0, ballX, ballY);
  37.   for(int i=1; i<numSegments; i++) {
  38.     reachSegment(i, targetX, targetY);
  39.   }
  40.   for(int i=x.length-1; i>=1; i--) {
  41.     positionSegment(i, i-1);  
  42.   }
  43.   for(int i=0; i<x.length; i++) {
  44.     segment(x[i], y[i], angle[i], (i+1)*2);
  45.   }
  46. }
  47.  
  48. void positionSegment(int a, int b) {
  49.   x[b] = x[a] + cos(angle[a]) * segLength;
  50.   y[b] = y[a] + sin(angle[a]) * segLength;
  51. }
  52.  
  53. void reachSegment(int i, float xin, float yin) {
  54.   float dx = xin - x[i];
  55.   float dy = yin - y[i];
  56.   angle[i] = atan2(dy, dx);  
  57.   targetX = xin - cos(angle[i]) * segLength;
  58.   targetY = yin - sin(angle[i]) * segLength;
  59. }
  60.  
  61. void segment(float x, float y, float a, float sw) {
  62.   strokeWeight(sw);
  63.   pushMatrix();
  64.   translate(x, y);
  65.   rotate(a);
  66.   line(0, 0, segLength, 0);
  67.   popMatrix();
  68. }

См.также

Внешние ссылки

  1. processing.org - Reach 3 based on code from Keith Peters.