Sphere类定义
这个类是球体,也就是一会要显示的球体了。这个类继承于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类定义的更多相关文章
- Python笔记——类定义
Python笔记——类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...
- 几种常用的JS类定义方法
几种常用的JS类定义方法 // 方法1 对象直接量var obj1 = { v1 : "", get_v1 : function() { return ...
- Js 类定义的几种方式
提起面向对象我们就能想到类,对象,封装,继承,多态.在<javaScript高级程序设计>(人民邮电出版社,曹力.张欣译.英文名字是:Professional JavaScript for ...
- 为什么C++类定义中,数据成员不能被指定为自身类型,但可以是指向自身类型的指针或引用?为什么在类体内可以定义将静态成员声明为其所属类的类型呢 ?
static的成员变量,不是存储在Bar实例之中的,因而不会有递归定义的问题. 类声明: class Screen: //Screen类的声明 1 类定义: class Screen{ //Scree ...
- C++学了这么多年,你也许不知道为什么类定义要放在.h文件,类实现放在cpp文件。它们如何关联?
原文 http://blog.csdn.net/ithzhang/article/details/8119286 主题 C++ C++学了这么多年你知道为什么定义类时,类的定义放在.h文件中,而类 ...
- YTU 2602: 熟悉题型——类设计( 矩形类定义【C++】)
2602: 熟悉题型--类设计( 矩形类定义[C++]) 时间限制: 1 Sec 内存限制: 128 MB 提交: 183 解决: 119 题目描述 定义一个矩形类,数据成员包括左下角和右上角坐标 ...
- Objective-c 类接口 (@interface) (类定义)
在Objective-c中如何定义一个类呢?我们可以使用下面的格式进行表示: @interface 类名:父类名{ 变量定义; } 方法定义: @end; 下面给出一个实例: @interface P ...
- 只能从脚本中调用在类定义上有[ScriptService]属性的Web服务问题的解决方案
ajax调用webservice中的接口时, 会出现[只能从脚本中调用在类定义上有[ScriptService]属性的...]的异常. 这是因为, 在.net3.5中, 访问web服务, 要对web服 ...
- 开涛spring3(12.4) - 零配置 之 12.4 基于Java类定义Bean配置元数据
12.4 基于Java类定义Bean配置元数据 12.4.1 概述 基于Java类定义Bean配置元数据,其实就是通过Java类定义Spring配置元数据,且直接消除XML配置文件. 基于Java ...
随机推荐
- Activate-or-Not:learning-customized-activation
关于activate-or-Not的PPT paper code step1 step2 step3 step4 step5 step6 step7 step8 step9 step10
- 『忘了再学』Shell基础 — 20、Shell中的运算符
目录 1.Shell常用运算符 2.Shell中数值运算的方法 (1)方式一 (2)方式二 (3)方式三(推荐) 1.Shell常用运算符 Shell中常用运算符如下表: 优先级数值越大优先级越高,具 ...
- 【ACM程序设计】动态规划 第二篇 LCS&LIS问题
动态规划 P1439 [模板]最长公共子序列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 给出 1,2,-,n 的两个排列 P1 和 P2 ,求它们的最长公共子序列. ...
- 创建NuGet本地包源
NuGet 是免费.开源的包管理开发工具,专注于在 .NET 应用开发过程中,简单地合并第三方的组件库.使用Visual Studio 可以很方便地将类库等项目打包发布,最简单的办法是上传到Nuget ...
- 《Mybatis 手撸专栏》第10章:使用策略模式,调用参数处理器
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你这代码写的,咋这么轴呢! 说到轴,让我想起初中上学时老师说的话:"你那脑 ...
- 前端CSS3布局display:flex用法
前端CSS3布局display:flex用法 先附上代码 点击查看代码 <!DOCTYPE html> <html> <head> <meta charset ...
- python基础学习8
python基础学习8 内容概要 字典的内置方法 元组的内置方法 集合的内置方法 垃圾回收机制 内容详情 字典的内置方法 一.类型转换 res = dict(name='jason', pwd=123 ...
- 一文搞懂Kafka的基本原理及使用
Kafka的基本原理及使用 一.基本概念及原理 1.Kafka特点 Kafka 是一个分布式的流式平台,流式平台包括以下三个特点: 发布和订阅消息(流),类似于一个消息队列或企业消息系统 持久化收到的 ...
- 六、LVM和从磁盘配额
一.LVM概述 Logical Volume Manager,逻辑卷管理 优点:能够保证在现有数据不变的情况下,动态调整磁盘容量,从而提高磁盘管理的灵活性 /boot分区用于存放引导文件,不能基于LV ...
- JS:eval
定义和用法: eval() 函数计算 JavaScript 字符串,并把它作为脚本代码来执行.eval()函数并不会创建一个新的作用域,并且它的作用域就是它所在的作用域. 如果参数是一个表达式,eva ...