整个星期,我都在纠结我在一个编码平台上解决这个问题的方法有什么问题在这一点上,它不是试图在那里获得分数,而是更多地理解我的解决方案/推理中的错误所在。
这是作业:
步行者从O点出发,沿着OA、AB和BC走。当他是
在c中(c在上半平面),距离co是多少?
什么是角度TOC在正度,分,秒?
角度toa是α(这里是45度),角度hab是β(这里是30度
角度ubc是伽马(这里是60度)。
用参数求解任务函数(a,b,c,alpha,beta,gamma)
a,b,c:正整数,单位为距离α,β,γ:
以度数表示的正整数(正角度逆时针)
返回数组
第一个元素:距离co(四舍五入到最接近的整数),然后是角度
包含以下第三个元素的TOC:数组的第二个元素:
角度tOC(截断正整数)的度数
数组元素:角度tOC中的分钟数(截断
正整数)数组的第四个元素:秒数
角度TOC(截断正整数)
下面是一张小图片,展示了上述情况:
algorithm - 沃克三角拼图-LMLPHP
基本上每一步都创建一个矩形三角形。我的方法是用正弦规则逐步找到a,b和c的坐标,然后找到co和角cot就容易了。根据测试,我得到了正确的CO段,但角度似乎是错误的:

Test Failed
Expected Array(15, 135, 49, 18), but got Array(15, 143, 2, 45)


Test Failed
Expected Array(20, 141, 4, 23), but got Array(20, 139, 51, 47)

下面我粘贴我的解决方案和站点提供的测试用例:
object Walker {

  case class Point(x: Double, y: Double){
    def moveLeft(by: Double) = Point(by - x, y)
    def moveRight(by: Double) = Point(by + x, y)
    def moveUp(by: Double) = Point(x, by + y)
    def moveDown(by: Double) = Point(x, by - y)
    def inverse() = Point(y, x)
  }

  implicit def roundUp(d: Double): Int = math.ceil(d).toInt

  def solve(a: Int, b: Int, c: Int, alpha: Int, beta: Int, gamma: Int): Array[Int] = {
    val pointA = pointHypotenuse(a, alpha)
    val pointB = pointHypotenuse(b, beta).inverse().moveLeft(pointA.x).moveUp(pointA.y)
    val pointC = pointHypotenuse(c, gamma).moveLeft(pointB.x).moveDown(pointB.y)
    val coHypotenuse: Int = math.sqrt(math.pow(pointC.x, 2) + math.pow(pointC.y, 2))
    val sinC = math.sin(math.abs(pointC.x)/coHypotenuse)
    val tOC = 180 - sinC.toDegrees
    coHypotenuse +: degrees(tOC)
  }

  def pointHypotenuse(coteHypotenuse: Int, angleHypotenuse: Int): Point = {
    val sinDuAngle = math.sin(math.toRadians(angleHypotenuse))
    val coteOppose = sinDuAngle * coteHypotenuse
    Point(math.sqrt(math.pow(coteHypotenuse, 2) - math.pow(coteOppose, 2)), coteOppose)
  }

  def degrees(deg: Double): Array[Int] = {
    Stream.iterate((deg.toInt, deg - deg.toInt)){
      case (_, r) =>
        val by60 = r*60
        (by60.toInt, by60 - by60.toInt)
    }.map(_._1).take(3).toArray
  }
}

测试(从平台):
class WalkerTest extends FlatSpec {
  it should "pass basic tests" in {
    dotest(12, 20, 18, 45, 30, 60, Array(15, 135, 49, 18))
    dotest(15,15,19,50,29,55, Array(12, 133, 18, 44))
    dotest(14,25,17,41,35,59, Array(20, 129, 41, 57))

  }
}

object WalkerTest {
  private def dotest(a: Int, b: Int, c: Int, aa: Int, bb: Int, cc: Int, expect: Array[Int]): Unit = {
    val actual: Array[Int] = Walker.solve(a, b, c, aa, bb, cc)
    assertResult(expect){actual}
  }
}

我不认为这是一个舍入错误(用断言产生的int距离替换所有double)。我通常不会问这个,但我似乎真的被阻止了。

最佳答案

线

val sinC = math.sin(math.abs(pointC.x)/coHypotenuse)

获取某些段比率的正弦值,但此比率已经是余弦值。
要获得角度,应该使用arccos

关于algorithm - 沃克三角拼图,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51794879/

10-12 17:28