(几何)51Nod - 1265 四点共面

问题描述 :

       给出三维空间上的四个点(点与点的位置均不相同),判断这4个点是否在同一个平面内(4点共线也算共面)。如果共面,输出"Yes",否则输出"No"。

输入描述 :

  第1行:一个数T,表示输入的测试数量(1 <= T <= 1000);第2 - 4T + 1行:每行4行表示一组数据,每行3个数,x, y, z, 表示该点的位置坐标(-1000 <= x, y, z <= 1000)。

输出描述 :

  输出共T行,如果共面输出"Yes",否则输出"No"

Sample Input
1
1 2 0
2 3 0
4 0 0
0 0 0
Sample Output
Yes


题解 : 

  三个点可确定一个面,求出该面的法向量,在三点中任意找一点与剩余一点构成一个向量,再判断其与法向量的 垂直、相交、平行 关系,只要知道求法向量的公式,一切ok !!

  四点 : (a,b,c)  (a1,b1,c1)  (a2,b2,c2)  (a3,b3,c3)

  向量1 : (x1,y1,z1)  double x1=a1-a; double y1=b1-b; double z1=c1-c;

向量2 : (x2,y2,z2)  double x2=a2-a; double y2=b2-b; double z2=c2-c;

向量3 : (x3,y3,z3)  double x3=a3-a; double y3=b3-b; double z3=c3-c;

法向量 : (x,y,z)

    |y1   z1|
  X = |       |   X = y1*z2-y2*z1
      |y2   z2|

|x1   z1|
  Y = - |       |   Y = -(x1*z2-x2*z1)=x2*z1-x1*z2

      |x2   z2|

|x1   y1|
  Z = |       |   Z = x1*y2-x2*y1
      |x2   y2|

  垂直 : x*x3+y*y3+z*z3=0

#include<stdio.h>
int main(){
   int t;
   double a,b,c,a1,b1,c1,a2,b2,c2,a3,b3,c3;
   scanf("%d",&t);
   while(t--){
      scanf("%lf %lf %lf",&a,&b,&c);
      scanf("%lf %lf %lf",&a1,&b1,&c1);
      scanf("%lf %lf %lf",&a2,&b2,&c2);
      scanf("%lf %lf %lf",&a3,&b3,&c3);
      double x1=a1-a;   double y1=b1-b;    double z1=c1-c;
      double x2=a2-a;   double y2=b2-b;    double z2=c2-c;
      double x3=a3-a;   double y3=b3-b;    double z3=c3-c;
      double x=y1*z2-y2*z1;
      double y=x2*z1-x1*z2;
      double z=x1*y2-x2*y1;
      double g=x3*x+y3*y+z3*z;
      if(g==0){
       printf("Yes\n");
 }
 else{
  printf("No\n");
 }
   }
    return 0;
}

### ThreadPoolExecutor 与 ThreadPoolTaskExecutor 的区别 #### ThreadPoolExecutor 特点 `ThreadPoolExecutor` 是 `java.util.concurrent` 包中的一个类,用于管理线程池。它提供了创建不同类型的线程池的能力,并允许配置核心线程数、最大线程数以及保持活动时间等参数[^1]。 ```java ThreadPoolExecutor executor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.SECONDS, workQueue); ``` 此实现方式直接操作底层并发工具库,适合于需要精细控制线程池行为的应用场景。 #### ThreadPoolTaskExecutor 特点 相比之下,在Spring框架内使用的 `ThreadPoolTaskExecutor` 实际上是对 `ThreadPoolExecutor` 进行了一层封装。通过这种方式,开发者可以更方便地利用Spring容器来管理和配置线程池资源。此外,还支持Bean属性注入等方式简化设置过程。 ```xml <bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"> <property name="corePoolSize" value="5"/> <property name="maxPoolSize" value="10"/> </bean> ``` 或者采用Java Config形式: ```java @Configuration public class AppConfig { @Bean(name = "taskExecutor") public TaskExecutor threadPoolTaskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(5); executor.setMaxPoolSize(10); return executor; } } ``` 当向此类对象提交任务时,并不是手动获取线程去执行任务,而是将可运行的任务加入到队列中由内部机制决定何时被执行[^2]。 对于偏好XML配置的情况,则可以通过 `<task:annotation-driven>` 元素配合自定义的 `executor` 来启用异步方法的支持[^3]。 综上所述,两者主要差异在于应用层次的不同——前者属于JDK层面的基础组件;后者则是基于Spring框架所提供的高级抽象接口,旨在提高开发效率的同时降低复杂度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值