Home | History | Annotate | Download | only in core
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include "core/geometry.h"
     18 
     19 #include <cmath>
     20 
     21 #include "base/logging.h"
     22 
     23 namespace android {
     24 namespace filterfw {
     25 
     26 float Point::Length() const {
     27   return std::sqrt(x_ * x_ + y_ * y_);
     28 }
     29 
     30 bool Point::ScaleTo(float new_length) {
     31   float length = Length();
     32   if (length == 0.0f) {
     33     return false;
     34   }
     35   x_ *= new_length / length;
     36   y_ *= new_length / length;
     37   return true;
     38 }
     39 
     40 float Point::Distance(const Point& p0, const Point& p1) {
     41   Point diff = p1 - p0;
     42   return diff.Length();
     43 }
     44 
     45 Point Point::operator+(const Point& other) const {
     46   Point out;
     47   out.x_ = x_ + other.x_;
     48   out.y_ = y_ + other.y_;
     49   return out;
     50 }
     51 
     52 Point Point::operator-(const Point& other) const {
     53   Point out;
     54   out.x_ = x_ - other.x_;
     55   out.y_ = y_ - other.y_;
     56   return out;
     57 }
     58 
     59 Point Point::operator*(float factor) const {
     60   Point out;
     61   out.x_ = factor * x_;
     62   out.y_ = factor * y_;
     63   return out;
     64 }
     65 
     66 void Point::Rotate90Clockwise() {
     67   const float x = x_;
     68   x_ = y_;
     69   y_ = -x;
     70 }
     71 
     72 bool Rect::ExpandToAspectRatio(float ratio) {
     73   if (width <= 0.0f || height <= 0.0f || ratio <= 0.0f) {
     74     return false;
     75   }
     76 
     77   const float current_ratio = width / height;
     78   if (current_ratio < ratio) {
     79     const float dx = width * (ratio / current_ratio - 1.0f);
     80     x -= dx / 2.0f;
     81     width += dx;
     82   } else {
     83     const float dy = height * (current_ratio / ratio - 1.0f);
     84     y -= dy / 2.0f;
     85     height += dy;
     86   }
     87   return true;
     88 }
     89 
     90 bool Rect::ExpandToMinLength(float length) {
     91   if (width <= 0.0f || height <= 0.0f || length <= 0.0f) {
     92     return false;
     93   }
     94 
     95   const float current_length = width > height ? width : height;
     96   if (length > current_length) {
     97     const float dx = width * (length / current_length - 1.0f);
     98     x -= dx / 2.0f;
     99     width += dx;
    100     const float dy = height * (length / current_length - 1.0f);
    101     y -= dy / 2.0f;
    102     height += dy;
    103   }
    104   return true;
    105 }
    106 
    107 bool Rect::ScaleWithLengthLimit(float factor, float max_length) {
    108   if (width <= 0.0f || height <= 0.0f || factor <= 0.0f) {
    109     return false;
    110   }
    111 
    112   const float current_length = width > height ? width : height;
    113   if (current_length >= max_length) {
    114     return true;
    115   }
    116 
    117   float f = factor;
    118   if (current_length * f > max_length) {
    119     f *= max_length / (current_length * f);
    120   }
    121 
    122   const float dx = width * (f - 1.0f);
    123   x -= dx / 2.0f;
    124   width += dx;
    125   const float dy = height * (f - 1.0f);
    126   y -= dy / 2.0f;
    127   height += dy;
    128   return true;
    129 }
    130 
    131 const Point& Quad::point(int ix) const {
    132   ALOG_ASSERT(ix < static_cast<int>(points_.size()), "Access out of bounds");
    133   return points_[ix];
    134 }
    135 
    136 } // namespace filterfw
    137 } // namespace android
    138