Problem of Object Model arising from a Ray-trace Model

原创 2007年09月25日 23:07:00

The purpose of the following code i wrote is to test the feasibility and efficiency of a surface object for regulating bending of light (refract or reflect) in a ray-trace simulator. The first method which looks ugly shows the mechanism straightforwardly. The second uses multi-inheritance in a weird style. Both methods fulfill the requirement of making two references of interface for both sides on one object with one copy of data. The result (with a gcc compiler) shows the size of entitative object "boundary" in both implementation is 16 bytes, 8 extra bytes in addition to 8-byte useful contents.

Original mail sent to robbie (poorly written illustration):

two objects "connected by" a "boundary", from each side to the other, a "surface" is applied to provide a transfer value n1/n2 or n2/n1, like refraction coefficient... "Cast" initiates the transfer procedure from either side to the other, returns the sum of both objects inner data and surface transfer value in corresponding direction.

Code:

#include <stdio.h>

#if 0

/* embedded */

struct Surface
{
    virtual float Transfer () = 0;
};

struct BoundaryData
{
    float   m_AToB;
    float   m_BToA;
};

struct Boundary
{
   struct SurfaceAToB : public Surface
    {
        virtual float Transfer ()
        {
            printf("a2b/n");
            BoundaryData *bd = reinterpret_cast<BoundaryData *>
                (reinterpret_cast<char*>(this) - sizeof(BoundaryData));
            return bd->m_AToB / bd->m_BToA;
        }
    };

    struct SurfaceBToA : public Surface
    {
        virtual float Transfer ()
        {
            printf("b2a/n");
            BoundaryData *bd =
                reinterpret_cast<BoundaryData *>
                (reinterpret_cast<char*>(this) - sizeof(SurfaceAToB) - sizeof(BoundaryData));
            return bd->m_BToA / bd->m_AToB;
        }
    };

    BoundaryData    m_Data;
    SurfaceAToB     m_SurfAToB;
    SurfaceBToA     m_SurfBToA;

    void SetAToB (float v)
    {
        m_Data.m_AToB = v;
    }
    void SetBToA (float v)
    {
        m_Data.m_BToA = v;
    }

    Surface * GetSurfaceAToB ()
    {
        return &m_SurfAToB;
    }

    Surface * GetSurfaceBToA ()
    {
        return &m_SurfBToA;
    }
};

#else

/* object oriented? nge */

struct Surface
{
    virtual float Transfer () = 0;
};

struct BoundaryData
{
    float   m_AToB;
    float   m_BToA;

    void SetAToB (float v)
    {
        m_AToB = v;
    }
    void SetBToA (float v)
    {
        m_BToA = v;
    }
};

struct SurfaceAToB : virtual public BoundaryData, public Surface
{
    virtual float Transfer ()
    {
        printf("a2b/n");
        return m_AToB / m_BToA;
    }
};

struct SurfaceBToA : virtual public BoundaryData, public Surface
{
    virtual float Transfer ()
    {
        printf("b2a/n");
        return m_BToA / m_AToB;
    }
};

struct Boundary : public SurfaceAToB, public SurfaceBToA
{
    Surface * GetSurfaceAToB ()
    {
        return dynamic_cast<SurfaceAToB *>(this);
    }

    Surface * GetSurfaceBToA ()
    {
        return dynamic_cast<SurfaceBToA *>(this);
    }
};

#endif

struct Object
{
    float   m_Data;

    Surface *m_pSurface;
};

Object  g_Obj1, g_Obj2;
Boundary    g_Bound;

void Create ()
{
    g_Obj1.m_Data = 1;
    g_Obj2.m_Data = 2;
    g_Bound.SetAToB(3);
    g_Bound.SetBToA(4);
    g_Obj1.m_pSurface = g_Bound.GetSurfaceAToB();
    g_Obj2.m_pSurface = g_Bound.GetSurfaceBToA();
}

float Cast (Object *obj1, Object *obj2)
{
    Surface *surface = obj1->m_pSurface;
    return obj1->m_Data + obj2->m_Data + surface->Transfer();
}

void ViewBoundaryInBinary (Boundary *boundary, int size)
{
    unsigned char *b = reinterpret_cast<unsigned char *>(boundary);
    for (int i = 0; i < size; i++)
    {
        printf("%2x, ", b[i]);
    }
    printf("/n");
}

int main ()
{
    printf("size of boundary is %d, of boundary data is %d/n", sizeof(Boundary), sizeof(BoundaryData));
    Create();
    ViewBoundaryInBinary(&g_Bound, sizeof(Boundary));
    float res = Cast(&g_Obj1, &g_Obj2);
    printf("Cast 1 to 2 is %f/n", res);
    res = Cast(&g_Obj2, &g_Obj1);
    printf("Cast 2 to 1 is %f/n", res);
    return 0;
}

result 1 (multi-inheritance disabled):
| two float values | place holder for two surface object
 0,  0, 40, 40,  0,  0, 80, 40, 54, 74, 40,  0, 64, 74, 40,  0,
a2b
Cast 1 to 2 is 3.750000
b2a
Cast 2 to 1 is 4.333333

 
result 2 (multi-inheritance enabled):
|     C++ RTTI     | two float values
1c, 74, 40,  0, 2c, 74, 40,  0,  0,  0, 40, 40,  0,  0, 80, 40,
a2b
Cast 1 to 2 is 3.750000
b2a
Cast 2 to 1 is 4.333333

 

jQuery操作DOM(Document、Object、Model)对象——页面元素操作

1.获取元素的属性:     attr(name); 2.设置元素的属性:     attr(key, value);     attr({key0 : value0,  key1 : val...
  • u012342408
  • u012342408
  • 2015年05月03日 15:01
  • 907

使用高性能xml序列化框架jibx作为spring mvc的xml view

package org.springframework.web.servlet.view.xml; import java.io.ByteArrayOutputStream; import j...
  • skmbw
  • skmbw
  • 2013年09月17日 18:03
  • 2377

6.自己动手写Java Web框架-Model

前一篇已经介绍了上下文,上下文中存储了一个全局的变量,在Controller调用其方法时,可以将绑定的参数用实际值替换,例如@RequestParam绑定的参数,就是获取request的参数值,用@P...
  • beautiful5200
  • beautiful5200
  • 2016年09月18日 20:30
  • 909

Django学习小记[2] —— Model

开始学习django的model了,学习django的目的很简单,就是我想用django搭建一个自己的博客,现在开源的已经有django-zinnia这个博客引擎了,但是想要看懂它,并且修改它,就必须...
  • hackerain
  • hackerain
  • 2014年09月11日 02:27
  • 17304

《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记

来源:http://dsqiu.iteye.com/blog/1669614 之前一直对C++内部的原理的完全空白,然后找到《Inside The C++ Object Model》...
  • freeking101
  • freeking101
  • 2017年03月03日 14:52
  • 1704

POM(Project Object Model)项目对象模型详解

一、什么是POM Project Object Model,项目对象模型。通过xml格式保存的pom.xml文件。作用类似ant的build.xml文件,功能更强大。该文件用于管理:源代码、配置文件...
  • wb96a1007
  • wb96a1007
  • 2016年07月21日 16:58
  • 483

.NET MVC 扩展 HtmlHelper 从无到有(二)[双model,双表单]

本次扩展有点大气,但是还没有完全好,但是能满足我项目的需求了。 如果你的view里需要两个model怎么做验证? 比如,一个return( new User());的页面,怎么提交一个 News的...
  • feng005211
  • feng005211
  • 2015年01月06日 23:48
  • 610

Atitit.uml2 api 的编程代码实现设计uml开发 使用eclipse jar java 版本

Atitit.uml2 api 的编程代码实现设计uml开发 使用eclipse jar java 版本     1. clipse提供了UML的底层Java包, 1 2. MDTUML2G...
  • attilax
  • attilax
  • 2016年01月12日 00:17
  • 649

java Vo和Model的转换工具

声明:是将项目中的内容总结出来的。 Model类的属性和数据表中的字段是一一对应的,Vo首先属性值也是要和Model类中的属性一一对应,其次Vo也可以有自己的额外属性。 下面先将工具贴出: ...
  • yehui18sui
  • yehui18sui
  • 2013年05月14日 17:29
  • 2592

Django(八)上:Model操作和Form操作

Model和Form以及ModelForm简介 Model操作: 创建数据库表结构 操作数据库表 做一部分的验证 Form操作: 数据验证(强大) ModelForm 数据库操作 数据验证 ad...
  • fgf00
  • fgf00
  • 2017年01月19日 12:43
  • 1127
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Problem of Object Model arising from a Ray-trace Model
举报原因:
原因补充:

(最多只允许输入30个字)