牛客网 2018校招真题 百度 正三角形的顶点位置

Description

牛客网 2018校招真题 正三角形的顶点位置

Solving Ideas

double dx = x2 - x1, dy = y2 - y1;
考虑dx != 0 && dy != 0的情况:
AE 垂直于 OE,当斜率 k < 0 时,有
在这里插入图片描述
其中, ∵ ∠ O A E = ∠ B C D ∴ s i n ∠ O A E = s i n ∠ B C D = B D B C \because \angle OAE = \angle BCD \\ \therefore sin\angle OAE = sin\angle BCD = \frac{BD}{BC} OAE=BCDsinOAE=sinBCD=BCBD
(k > 0时类似)

Solution
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * @author wylu
 */
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine());

        while (t-- != 0) {
            String[] strs = br.readLine().split(" ");
            double x1 = Double.parseDouble(strs[0]), y1 = Double.parseDouble(strs[1]);
            double x2 = Double.parseDouble(strs[2]), y2 = Double.parseDouble(strs[3]);

            double dx = x2 - x1, dy = y2 - y1;
            double edgeLen = Math.sqrt(dx * dx + dy * dy);
            double height = Math.sqrt(3) / 2.0 * edgeLen;

            double resX1, resY1, resX2, resY2;
            if (dx == 0) {
                resX1 = x1 - height;
                resX2 = x1 + height;
                resY1 = (y1 + y2) / 2.0;
                resY2 = resY1;
            } else if (dy == 0) {
                resX1 = (x1 + x2) / 2.0;
                resX2 = resX1;
                resY1 = y1 - height;
                resY2 = y1 + height;
            } else {
                double midX = (x1 + x2) / 2.0, midY = (y1 + y2) / 2.0;
                double sine = Math.abs(dy / edgeLen), k = dy / dx;
                double ox = height * sine, oy = ox / k;
                resX1 = midX - ox;
                resY1 = midY + oy;
                resX2 = midX + ox;
                resY2 = midY - oy;
            }
            System.out.printf("%.2f %.2f %.2f %.2f\n", resX1, resY1, resX2, resY2);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值