这个类是球体,也就是一会要显示的球体了。这个类继承于Geometrics类,并实现了自己的碰撞检测,碰撞原理,书上也说的很清楚了啊,大家多看。然后对照代码就明白了。

类定义:

#pragma once
#ifndef __SPHERE_HEADER__
#define __SPHERE_HEADER__ #include "../geometics.h" class Sphere :public Geometrics {
public:
Sphere();
~Sphere();
Sphere(const Point3& center, ldouble radius);
Sphere(const Sphere& sp);
virtual Geometrics* clone() const;
virtual bool hit(const Ray& ray, ldouble& tmin, ShadeRec& sr) const;
Sphere& operator=(const Sphere& sp);
void set_center(const Point3& p);
Point3 get_center() const;
void set_radius(const ldouble rd);
ldouble get_radius() const;
private:
Point3 c;
ldouble r;
};
#endif

类实现:

#include "pch.h"
#include "sphere.h" Sphere::Sphere() :Geometrics(), c(), r(0) {} Sphere::~Sphere() {} Sphere::Sphere(const Point3& center, ldouble radius) : Geometrics(), c(center), r(radius) {} Sphere::Sphere(const Sphere& sp) : Geometrics(sp), c(sp.c), r(sp.r) {} Geometrics* Sphere::clone() const {
return new Sphere(*this);
} bool Sphere::hit(const Ray& ray, ldouble& tmin, ShadeRec& sr) const {
ldouble t;
Vector3 oc = ray.o - c;
ldouble a = ray.d * ray.d,
b = 2.0 * oc * ray.d,
c = oc * oc - r * r,
disc = b * b - 4.0 * a * c;
if (disc >= 0) {
t = (-b - std::sqrt(disc)) / (2.0 * a);
if (t > 0) {
tmin = t;
sr.normal = (oc + t * ray.d) / r;
sr.local_hit_point = ray.o + t * ray.d;
return true;
}
t = (-b + std::sqrt(disc)) / (2.0 * a);
if (t > 0) {
tmin = t;
sr.normal = (oc + t * ray.d) / r;
sr.local_hit_point = ray.o + t * ray.d;
return true;
}
}
return false;
} Sphere& Sphere::operator=(const Sphere& sp) {
if (this == &sp)
return *this;
Geometrics::operator=(sp);
c = sp.c;
r = sp.r;
return *this;
} void Sphere::set_center(const Point3& p) {
c = p;
} Point3 Sphere::get_center() const {
return c;
} void Sphere::set_radius(const ldouble rd) {
r = rd;
} ldouble Sphere::get_radius() const {
return r;
}

  

Sphere类定义的更多相关文章

  1. Python笔记——类定义

    Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...

  2. 几种常用的JS类定义方法

    几种常用的JS类定义方法   // 方法1 对象直接量var obj1 = {    v1 : "",    get_v1 : function() {        return ...

  3. Js 类定义的几种方式

    提起面向对象我们就能想到类,对象,封装,继承,多态.在<javaScript高级程序设计>(人民邮电出版社,曹力.张欣译.英文名字是:Professional JavaScript for ...

  4. 为什么C++类定义中,数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用?为什么在类体内可以定义将静态成员声明为其所属类的类型呢 ?

    static的成员变量,不是存储在Bar实例之中的,因而不会有递归定义的问题. 类声明: class Screen: //Screen类的声明 1 类定义: class Screen{ //Scree ...

  5. C++学了这么多年,你也许不知道为什么类定义要放在.h文件,类实现放在cpp文件。它们如何关联?

    原文  http://blog.csdn.net/ithzhang/article/details/8119286 主题 C++  C++学了这么多年你知道为什么定义类时,类的定义放在.h文件中,而类 ...

  6. YTU 2602: 熟悉题型——类设计( 矩形类定义【C++】)

    2602: 熟悉题型--类设计( 矩形类定义[C++]) 时间限制: 1 Sec  内存限制: 128 MB 提交: 183  解决: 119 题目描述 定义一个矩形类,数据成员包括左下角和右上角坐标 ...

  7. Objective-c 类接口 (@interface) (类定义)

    在Objective-c中如何定义一个类呢?我们可以使用下面的格式进行表示: @interface 类名:父类名{ 变量定义; } 方法定义: @end; 下面给出一个实例: @interface P ...

  8. 只能从脚本中调用在类定义上有[ScriptService]属性的Web服务问题的解决方案

    ajax调用webservice中的接口时, 会出现[只能从脚本中调用在类定义上有[ScriptService]属性的...]的异常. 这是因为, 在.net3.5中, 访问web服务, 要对web服 ...

  9. 开涛spring3(12.4) - 零配置 之 12.4 基于Java类定义Bean配置元数据

    12.4  基于Java类定义Bean配置元数据 12.4.1  概述 基于Java类定义Bean配置元数据,其实就是通过Java类定义Spring配置元数据,且直接消除XML配置文件. 基于Java ...

随机推荐

  1. python函数学习的总结

    python函数 part1 函数的作用: 函数以功能(完成一件事)为导向 随调随用减少代码重复性 增强代码可读性 函数的结构: def 函数名(): 函数体 函数的返回值 return:在函数中遇到 ...

  2. 一些实验中用过的python函数/方法(持续更新)

    衡量运行时间 很多时候你需要计算某段代码执行所需的时间,可以使用 time 模块来实现这个功能. import time startTime = time.time() # write your co ...

  3. 碎碎念软件研发02:敏捷之Scrum

    一.什么是 Scrum 1.1 Scrum 定义 Scrum 是敏捷开发方法之一,它使用比较广泛. 敏捷的其它开发方法还有 XP(极限编程).FDD(特性驱动开发).Crystal(水晶方法).TDD ...

  4. [USACO2021DEC] HILO 踩标做法

    [USACO2021DEC] HILO Solution 参考自 官方题解 里提到的一篇 Obliteration.pdf,但是里面作者写出了极多错误...然后式子还错错得对了. 令 \(y=n-x\ ...

  5. salesforce零基础学习(一百一十五)记一个有趣的bug

    本篇参考:https://help.salesforce.com/s/articleView?language=en_US&type=1&id=000319486 page layou ...

  6. 面试官:Dubbo是什么,他有什么特性?

    哈喽!大家好,我是小奇,一位热爱分享的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 书接上回,今天还是过周末,虽然 ...

  7. css设置元素背景透明度的2种方式

    更新记录 本文迁移自Panda666原博客,原发布时间:2021年7月9日. 设置元素的背景的透明度可以使用2种方式:方式1:opacity属性.方式2:使用rgba值.两种方式有一点差异,opaci ...

  8. ShardingSphere-proxy-5.0.0分布式雪花ID生成(三)

    一.目的 保证在分库分表中每条数据具有唯一性 二.修改配置文件config-sharding.yaml,并重启服务 # # Licensed to the Apache Software Founda ...

  9. 什么是工业仿真?工业3D仿真有什么样的市场价值?

    什么是工业仿真? 工业仿真是对实体工业的一种虚拟,它将实体工业中的各个模块转化成数据整合到一个虚拟的体系中去.这个体系会模拟现实工业作业中的每一项工作和流程,并与之实现各种交互. 工业仿真技术作为目前 ...

  10. BUUCTF-来首歌吧

    来首歌吧 歌曲题目一般就是整个摩斯电码 看上面的样子应该就是摩斯电码解密一下 ..... -... -.-. ----. ..--- ..... -.... ....- ----. -.-. -... ...