Felix Riesterer: Ellipsen überfordern mich - bitte um Hilfe

Beitrag lesen

Hallo Ingrid,

die Kollisionsabfrage löse ich jetzt so (live-Beispiel zum Testen dauert leider noch):

function doCollideElliptically (element1, element2) {

  var ellipse1 = {
      a: element1.offsetWidth,
      b: element1.offsetHeight,
      m: {
        x: element1.offsetLeft + Math.floor(element1.offsetWidth / 2),
        y: element1.offsetTop + Math.floor(element1.offsetHeight / 2)
      }
    },

    ellipse2 = {
      a: element2.offsetWidth,
      b: element2.offsetHeight,
      m: {
        x: element2.offsetLeft + Math.floor(element2.offsetWidth / 2),
        y: element2.offsetTop + Math.floor(element2.offsetHeight / 2)
      }
    },

    isPixelInEllipse = function (pixel, ellipse) {
      return (
        Math.pow(pixel.x - ellipse.m.x, 2) / Math.pow(ellipse.a, 2)
        + Math.pow(pixel.y - ellipse.m.y, 2) / Math.pow(ellipse.b, 2)
        <= 1
      );
    },

    sharedPixels = [],

    i, x, y;

  // get pixels of intersection
  for (
    y = element1.offsetTop;
    y < element1.offsetTop + element1.offsetHeight;
    y++
  ) {

    for (
      x = element1.offsetLeft;
      x < element1.offsetLeft + element1.offsetWidth;
      x++
    ) {

      // pixel inside both boxes?
      if (
        x >= element2.offsetLeft
        && x < element2.offsetLeft + element2.offsetWidth
        && y >= element2.offsetTop
        && y < element2.offsetTop + element2.offsetHeight
      ) {
        sharedPixels.push({x:x, y:y});
      }
    }
  }

  // do shared pixels belong into both ellipses?
  if (sharedPixels.length) {

    for (i = 0; i < sharedPixels.length; i++) {

      if (
        isPixelInEllipse(sharedPixels[i], ellipse1)
        && isPixelInEllipse(sharedPixels[i], ellipse2)
      ) {
        return true;
      }
    }
  }

  return false;
}

Allen an dieser sehr faszinierenden und umfangreichen Diskussion Beteiligten meinen herzlichen Dank für alle Anregungen, insbesondere auch die, die nicht (un)mittelbar zur Lösung beigetragen haben. Zusätzlich zu einer funktionierenden Kollisionsberechnung auf Ellipsenbasis habe ich jetzt ein besseres Verständnis, was es mit Ellipsen alles auf sich hat und welche Komplexitäten das Thema mit sich bringt. Es ist definitiv nicht Bestandteil dessen, was in der Schule an algebraischen und geometrischen Inhalten vermittelt wird.

Liebe Grüße,

Felix Riesterer.

0 62

Ellipsen überfordern mich - bitte um Hilfe

Felix Riesterer
  • grafik
  • mathematik
  • programmiertechnik
  1. 0
    MudGuard
    1. 0
      derdicki
      1. 0
        Felix Riesterer
    2. 0
      Felix Riesterer
    3. 0
      Felix Riesterer
      1. 0
        Matthias Scharwies
        1. 0
          Felix Riesterer
          1. 0
            Matthias Apsel
  2. 0
    J o
    1. 0
      Felix Riesterer
  3. 0
    Gunnar Bittersmann
  4. 0
    Tabellenkalk
    1. 0
      Felix Riesterer
      1. 0
        Matthias Apsel
        1. 0
          Gunnar Bittersmann
          1. 0
            Felix Riesterer
  5. 0
    Richard Rüfenacht
    1. 0
      Felix Riesterer
      1. 0
        Richard Rüfenacht
        1. 0
          Felix Riesterer
          1. 0
            Matthias Apsel
            1. 0
              Felix Riesterer
              1. 0
                Camping_RIDER
          2. 2
            Rolf B
            1. 0
              Felix Riesterer
              1. 0
                Rolf B
                1. 0
                  Felix Riesterer
                  1. 0
                    Rolf B
                    1. 0
                      Felix Riesterer
                      1. 0
                        Gunnar Bittersmann
                        1. 0
                          dedlfix
                          1. 0
                            JürgenB
                        2. 0
                          Felix Riesterer
                          1. 0
                            Rolf B
          3. 0
            Richard Rüfenacht
  6. 0
    Rolf B
    1. 0
      Gunnar Bittersmann
      1. 0
        Rolf B
        1. 0
          Felix Riesterer
          1. 1
            Rolf B
      2. 0
        Rolf B
  7. 0
    derdicki
    1. 0
      Rolf B
  8. 1
    Gunnar Bittersmann
    1. 0
      Rolf B
      1. 0
        Gunnar Bittersmann
        1. 0
          Gunnar Bittersmann
    2. 0
      ottogal
      1. 0
        Gunnar Bittersmann
  9. 0
    ottogal
    1. 0
      Rolf B
      1. 0
        ottogal
        1. 0
          Rolf B
          1. 0
            ottogal
  10. 3
    Mitleser
  11. 0
    Felix Riesterer
    1. 0
      Rolf B
      1. 0
        beatovich
        1. 0
          Rolf B
      2. 0
        MudGuard
        1. 0
          Rolf B